為什么這樣有效:
( ) <$> (*2) <*> (*2) $ 2
但是這個沒有?
( ) <$> (*2) <*> (*2) <*> (*2) $ 2
(錯誤是:無法構造無限型別)
然而這個確實:
(\x y z -> x y z) <$> (*2) <*> (*2) <*> (*2) $ 2
抱歉,如果這些是微不足道的問題,我正在學習 Haskell 并希望確保在繼續下一個主題之前完全理解它。
uj5u.com熱心網友回復:
( )與 相同(\x y -> x y),或者如果您Num在范圍內有一個非常奇怪的實體(\x y z -> (x y) z),則與 . 不同(\x y z -> x y z)。簡單的解釋是( )需要兩個引數,在你的非作業片段中,你試圖傳遞三個引數。您的第三個片段有效,因為您使用的是兩個 s 而不是一個。考慮一下( ) 4 4和( ) (( ) 4 4) 4都是有效的,但事實( ) 4 4 4并非如此。
uj5u.com熱心網友回復:
的型別( )是Int -> Int -> Int(其實它更通用,但我將在Int這個例子中使用具體型別)。因此,它是一個以兩個整數作為輸入的函式。
的型別(\x y z -> x y z)是Int -> Int -> Int -> Int。因此,它是一個以三個整數作為輸入的函式。
這兩個函式不能互換,因為型別不一樣。
也許您的困惑源于不清楚的錯誤資訊。如果你真的寫出這樣的具體型別( ):
ghci> (( ) :: Int -> Int -> Int) <$> (* 2) <*> (* 2 ) <*> (* 2) $ 2
然后你會得到一個更好的錯誤資訊:
<interactive>:7:1: error:
* Couldn't match type `Int' with `Int -> t'
Expected type: Int -> Int -> t
Actual type: Int -> Int
* Possible cause: `(<*>)' is applied to too many arguments
...
* Relevant bindings include it :: t (bound at <interactive>:7:1)
仍然不是很清楚,但至少它提到引數的數量是關閉的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/465875.html
標籤:哈斯克尔
