2017-09-13 47 views
0

學習Haskell。喜歡它。像書一樣,但是卡住了類型,類型類。 給定類型聲明Haskell第一原理獲得類型聲明函數,不明白GitHub上的答案

co :: (b -> c) -> (a -> b) -> a -> c 
co = undefined -- (obviously) 

問題在本書:設計功能(在GitHub上回答)

co = ($) 

是它編譯但

1)爲什麼?

2)這個函數做了什麼,它爲什麼會這樣查找。只是想了解而不是隻記得。

+0

co是一個函數,它接受來自b-> c的函數並返回一個函數,該函數從a-> b中接受函數並返回一個函數,該函數接受a並返回c。這意味着您可以定義與該類型簽名匹配的任何函數。 –

+11

不,它不會編譯。另見[區別。和$](https://stackoverflow.com/q/940382/791604)。 –

回答

3

是它編譯但

它不會編譯,因爲它不鍵入正確的:

/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的第一個參數是轉換類型的值的函數bc的值。第二個是將a類型的值轉換爲b類型的值的函數。最後一個參數是類型a的值。從這裏顯然你可以將第二個參數應用到第三個參數,獲得b,然後應用第一個參數,獲得類型爲c的值。

只要你理解函數應用的語法,事情應該從這裏顯而易見。

+0

非常感謝。我想我可以再次學習類型和類型類,只是爲了確保我能夠獲得例程。謝謝你回答這個問題。感謝幫助! – Madderote

+0

按照你的答案,我蒸餾了以下,它typechecks! 共::(二 - > C) - >(A - > B) - >一 - >ç 其中 B = A Ç= B A = A – Madderote

+0

@Madderote雖然該助=一將typecheck,它不會評估任何東西,因爲你已經定義了'a'和自己相等,'co''等於'a'。 'a'等於它本身意味着你已經形成了一個無限循環(或者可能是一個解釋它的例外,否則將是一個無限循環)。 – Potato44