學習Haskell。喜歡它。像書一樣,但是卡住了類型,類型類。 給定類型聲明Haskell第一原理獲得類型聲明函數,不明白GitHub上的答案
co :: (b -> c) -> (a -> b) -> a -> c
co = undefined -- (obviously)
問題在本書:設計功能(在GitHub上回答)
co = ($)
是它編譯但
1)爲什麼?
2)這個函數做了什麼,它爲什麼會這樣查找。只是想了解而不是隻記得。
學習Haskell。喜歡它。像書一樣,但是卡住了類型,類型類。 給定類型聲明Haskell第一原理獲得類型聲明函數,不明白GitHub上的答案
co :: (b -> c) -> (a -> b) -> a -> c
co = undefined -- (obviously)
問題在本書:設計功能(在GitHub上回答)
co = ($)
是它編譯但
1)爲什麼?
2)這個函數做了什麼,它爲什麼會這樣查找。只是想了解而不是隻記得。
是它編譯但
它不會編譯,因爲它不鍵入正確的:
/tmp/so.hs:2:6: error:
• Couldn't match type ‘c’ with ‘a -> c’
‘c’ is a rigid type variable bound by
the type signature for:
co :: forall b c a. (b -> c) -> (a -> b) -> a -> c
at /tmp/so.hs:1:1-36
Expected type: (b -> c) -> (a -> b) -> a -> c
Actual type: ((a -> b) -> a -> c) -> (a -> b) -> a -> c
• In the expression: ($)
In an equation for ‘co’: co = ($)
• Relevant bindings include
co :: (b -> c) -> (a -> b) -> a -> c (bound at /tmp/so.hs:2:1)
|
2 | co = ($)
通俗地說,co
的第一個參數是轉換類型的值的函數b
至c
的值。第二個是將a
類型的值轉換爲b
類型的值的函數。最後一個參數是類型a
的值。從這裏顯然你可以將第二個參數應用到第三個參數,獲得b
,然後應用第一個參數,獲得類型爲c
的值。
只要你理解函數應用的語法,事情應該從這裏顯而易見。
co是一個函數,它接受來自b-> c的函數並返回一個函數,該函數從a-> b中接受函數並返回一個函數,該函數接受a並返回c。這意味着您可以定義與該類型簽名匹配的任何函數。 –
不,它不會編譯。另見[區別。和$](https://stackoverflow.com/q/940382/791604)。 –