2015-12-30 18 views
0

我有一个函数的组合,其中许多是运算符,用于将恒定的常数减去列表中第i个集合的大小。这里是我的代码:Haskell函数链

(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’ 

然而,

(k^)$(n-)$size$(phi !!)$i 

作品。怎么了?为什么组合不起作用,但应用程序工作?另外,是否将括号中的操作符写成最惯用的方式呢?感觉很奇怪。

+2

只是写'k ^(n - size(phi !! i))'会不会好得多? –

回答

2

而不是f . g . h x,你想f . g . h $ x:立即前者电话h x,然后组成是,作为一个功能,用fg后者构成共同fg,并h到一个新的功能,然后调用在i

+0

因此,应用程序绑定高于“。”,它绑定高于“$”? –

+3

应用程序绑定比其他任何东西都更紧密,'$'绑定比任何其他更紧密。因此,他们之间就是这样,而其他运营商也是如此。 – amalloy

+2

@RenéG,挑剔的是,如果你愿意,你可以编写你自己的操作符,它和'$'完全一样紧密,但是如果你愿意,你肯定会产生混淆。没有办法通过宏处理来将任何东西绑定得比函数应用程序更紧 - 这在语法上已经深化了。 – dfeuer

0

请注意,您可以使用括号将功能组合分组, ((k^).(n-).size.(phi !!)) i应该可以工作。