我目前正在學習 Haskell 課程,但我很難理解函式的型別,尤其是在有函式應用程式或 lambda 運算式時。例如說以下內容:
f = (\x -> \y -> \z -> [x (y z), y z])
或者
g = \x -> \y -> \z -> x.y.z
我可以對xandy是函式這一事實做出一些假設,但我沒有具體的方法來確定這些函式的型別。
對于以下情況類似:
h = foldr (&&)
我試著猜測然后:t在解釋器中檢查通過,但我通常會偏離很多。是否有任何特定的方法可以用來查找此類函式的型別?
uj5u.com熱心網友回復:
您首先將型別變數分配給輸入和結果
f = (\x -> \y -> \z -> [x (y z), y z])
并得出結論
f :: a -> b -> c -> d -- (A0)
-- or even (f is not needed)
\x -> \y -> \z -> [x (y z), y z] :: a -> b -> c -> d
那是
x :: a -- (1)
y :: b -- (2)
z :: c -- (3)
[x (y z), y z] :: d -- (4)
您可以繼續(4)并得出結論
型別
d是d1s的串列,即d ~ [d1] (5)f :: a -> b -> c -> [d1] -- (A1)并且串列的值是型別
d1,即x (y z) :: d1 -- (6) y z :: d1 -- (7)
從(6)你那里了解到
x :: e -> d1 -- (8)
y z :: e -- (9)
(1)并(8)統一,即a ~ (e -> d1)和
f :: (e -> d1) -> b -> c -> [d1] -- (A2)
你玩這個游戲直到你感到無聊并GHCi習慣于到達
f :: (d1 -> d1) -> (f -> d1) -> f -> [d1] -- (A3)
-- and renaming
f :: (a -> a) -> (b -> a) -> b -> [a] -- (A4)
如果您想了解更多資訊并閱讀論文,您可以從函式式程式的 Principal type-schemes開始。
uj5u.com熱心網友回復:
Prelude> :t h
h :: Foldable t => Bool -> t Bool -> Bool
Prelude> :t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
Prelude> :t (&&)
(&&) :: Bool -> Bool -> Bool
Prelude>
通過“插入”(&&),您已洗掉,(a -> b -> b)
因此您需要為該功能提供其余部分
b -> t a -> b
這被限制(&&)為作為第二個引數的布林值,第二個引數是t a也被限制為布林值。因為 a 和 b 需要與(a->b->b)函式中的型別相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370713.html
標籤:哈斯克尔
