Haskell 哈斯克尔函数链
我有一个函数的组合,其中很多是运算符,用来将一个常数提升到一个常数的幂减去列表中第I个集合的大小。这是我的密码:Haskell 哈斯克尔函数链,haskell,Haskell,我有一个函数的组合,其中很多是运算符,用来将一个常数提升到一个常数的幂减去列表中第I个集合的大小。这是我的密码: (k^).(n-).size.(phi !!) i 当我在一个测试用例上尝试它时,我得到了 <interactive>:64:16-25: Couldn't match expected type ‘a -> Set a0’ with actual type ‘Set a1’ Relevant bindings in
(k^).(n-).size.(phi !!) i
当我在一个测试用例上尝试它时,我得到了
<interactive>:64:16-25:
Couldn't match expected type ‘a -> Set a0’
with actual type ‘Set a1’
Relevant bindings include
it :: a -> c (bound at <interactive>:64:1)
Possible cause: ‘phi !!’ is applied to too many arguments
In the second argument of ‘(.)’, namely ‘(phi !!) 3’
In the second argument of ‘(.)’, namely ‘size . (phi !!) 3’
工作。发生了什么?为什么作文不起作用,应用却起作用?另外,在括号中组合运算符是最惯用的方法吗?感觉很奇怪。而不是
f。Gh x
,您需要f。Gh$x
:前者立即调用hx
,然后将其作为一个函数与f
和g
组合,后者将f
、g
和h
组合成一个新函数,然后在i
上调用该函数。注意,可以使用括号对函数组合进行分组,
((k^)。(n-).size.(phi!!)i
应该可以工作。因此,应用程序绑定的级别高于
,而$
绑定的级别高于$
?应用程序绑定的级别比其他任何东西都高,而$
绑定的级别低于其他任何东西。因此,
和其他任何操作符一样,都处于两者之间。@RenéG,为了挑剔,如果您愿意,您可以编写自己的操作符,使其与$
紧密绑定,但如果您这样做,肯定会造成混乱。除了宏处理,没有办法使任何东西的绑定比函数应用程序更紧密——这在语法中有很深的固定。特别挑剔的是,它们的绑定都没有用作模块分隔符的
和用于记录更新的{}
那么紧密,两者都是语法而不是运算符。。。但是你确实说了“其他任何东西”,我个人以前对记录更新语法的优先级感到困惑。写k^(n-size(phi!!I))
不是更好吗?
(k^)$(n-)$size$(phi !!)$i