[英]type signature of Haskell
cow :: (Eq a) => a -> a -> [a] -> Bool
cow x y z = x && y `elem` z
foo ::
foo x y z = x `elem` y && y `elem` z
bar::
bar x y = case y of
Nothing -> x
Just z -> x + z
我不知道類型簽名應該是什么。
為了確定類型簽名。 您不需要知道function 在做什么。 您可以使用您使用的函數的類型簽名,並對其進行推斷。
由於你的cow
function 的類型簽名並不完全正確,我們將展示如何推導出cow
function 的類型簽名,然后將其他兩個留作練習。
我們看到這里的cow
有三個參數: x
、 y
和z
。 目前,我們對x
、 y
和z
。 所以我們將為這些變量分配一個不同的類型變量。 所以x:: a
, y:: b
和z:: c
。
接下來我們可以開始推導類型。 cow
的 function 定義:
cow x y z = x && y `elem` z
可以寫成更規范的格式:
cow x y z = (&&) x (elem y z)
因此,我們看到我們在這里使用了兩個函數: (&&):: Bool -> Bool -> Bool
和elem:: (Eq e, Foldable f) => e -> fe -> Bool
,我們在這里使用e
而不是f
以避免與我們已經定義的類型變量a
發生“名稱沖突”。 由於我們使用x
作為(&&):: Bool -> Bool -> Bool
function 的參數,我們知道x
應該具有Bool
類型,因此a ~ Bool
( a
與Bool
類型相同)。 此外,我們因此知道(&&) x:: Bool -> Bool
。
接下來我們看到我們調用elem:: (Eq e, Foldable f) => e -> fe -> Bool
。 因此,這意味着y
,它是應用於elem
的第一個參數,因此具有類型e
,因此具有b ~ e
。
這進一步意味着elem x
因此具有類型(Eq e, Foldable f) => fe -> Bool
,我們將此 function 應用於z
參數。 因此,這意味着c ~ (Eq e, Foldable f) => fe
,並且elem yz
的類型是Bool
。
由於elem yz
的類型是Bool
,這與 function (&&) x
匹配,因此(&&) x (elem yz)
的類型是Bool
。
因此,我們得出:
x :: Bool
y :: e
z :: f e
具有類型約束Eq e
和Foldable f
。 因此,這意味着cow
具有 function:
cow :: (Eq e, Foldable f) => Bool -> e -> f e -> Bool
cow x y z = x && y `elem` z
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.