簡體   English   中英

Haskell 的類型簽名

[英]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有三個參數: xyz 目前,我們對xyz 所以我們將為這些變量分配一個不同的類型變量。 所以x:: ay:: bz:: c

接下來我們可以開始推導類型。 cow的 function 定義:

cow x y z = x && y `elem` z

可以寫成更規范的格式:

cow x y z = (&&) x (elem y z)

因此,我們看到我們在這里使用了兩個函數: (&&):: Bool -> Bool -> Boolelem:: (Eq e, Foldable f) => e -> fe -> Bool ,我們在這里使用e而不是f以避免與我們已經定義的類型變量a發生“名稱沖突”。 由於我們使用x作為(&&):: Bool -> Bool -> Bool function 的參數,我們知道x應該具有Bool類型,因此a ~ BoolaBool類型相同)。 此外,我們因此知道(&&) 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 eFoldable 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM