2015-12-30 146 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應該可以工作。