2014-05-24 78 views
0

讀優秀CoffeeScript Ristretto,我就遇到了這個功能:轉換CoffeeScript的高階函數到哈斯克爾

((x) -> 
    (y) -> 
    x 
)(1)(2) 

我的理解是,結果x是一樣的輸入x

Haskell版本(*)看起來像這樣嗎? 。

foo :: a -> b -> (a -> b) -> a 
foo x y f = x 

*注 - 我不知道是否有給Haskell的穩健型系統V 1-1翻譯的CoffeeScript

+0

爲什麼你的'foo'有三個參數? –

+0

啊,我想我忘記了哈斯克爾的所有功能都是咖喱的。因此'foo :: a - > b - > a'(如[@Benesh](http://stackoverflow.com/users/2212478/benesh)指出的)與上述CoffeeScript函數相同。但是,正如我剛剛閱讀的,這裏使用了閉包。所以,我不確定Haskell版本是否等價... –

+0

是否'foo = \ x-> \ y - > x'或'(\ x - > \ y - > x)1 2'看起來更像你原來的功能? –

回答

5

我認爲你正在尋找const

const :: a -> b -> a 

const的「功能」看起來就是對於所有的x :: a,const xb -> a類型的常數函數 - 它返回任何值的x

一種可能的實現是:

const x y = x 

所以const 1 2 == 1

3

看起來像一個直接翻譯到Haskell是

(\x -> \y -> x) 1 2 

所以,你可以定義foo作爲

foo = \x -> \y -> x 

這是const,由@Benesh指出。