Haskell 哈斯克尔函数链

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

我有一个函数的组合,其中很多是运算符,用来将一个常数提升到一个常数的幂减去列表中第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 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