簡體   English   中英

haskell類型簽名問題

[英]haskell type signature question

有人可以解釋一下,為什么這些函數具有不同數量的參數和行為 ,但是具有相同的類型簽名 ,但是它們都是正確的?

comp1 :: (a -> b) -> (b -> c) -> a -> c
comp1 f g = g.f

comp2 :: (a -> b) -> (b -> c) -> a -> c
comp2 f g x = g (f x)

還有,為什么comp2有

comp2 :: (a -> b) -> (b -> c) -> a -> c

而不是像

comp2 :: a -> (a -> b) -> (b -> c) -> a -> c

謝謝。

comp1 fg = gf以無樣式編寫(不是指點 ,而是指 )。 當您調用comp1 ,隱式地將第三個參數傳遞給gf ,這是兩個函數gf(gf) x等於g (fx) ,即g傳遞了fx的結果。 comp1不存在任何參數x ,因為它已隱式傳遞給函數。 (如果使您感覺更好,您可以將comp1視為部分應用咖喱函數。)

comp2的類型詢問兩個功能,一是從(a->b)和另一個(b->c)以及一個類型的參數a 無需在其簽名中添加a ->

這兩個功能實際上是等效的。 一個人只是簡單地使用一些Haskell技巧就更簡潔了。

comp2 f g x = g (f x)

是語法糖

comp2 = \f -> \g -> \x -> g (f x)

相似地

comp1 f g = g.f

是糖

comp1 = \f -> \g -> g.f

的定義. 是:

f1 . f2 = \x -> f1 (f2 x) -- Names of arguments have been changed to avoid confusion

因此,如果將定義插入到comp1的簡化格式中, comp1得到:

comp1 = \f -> \g -> \x -> g (f x)

這與comp2的簡化形式comp2 ,因此顯然定義是等效的。

咖喱 ML和Haskell中的多參數函數只是返回一個函數的單參數函數的語法糖。 它返回的函數采用其余參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM