簡體   English   中英

使用foldr的Haskell Type類

[英]Haskell Type class using foldr

我使用foldr編寫了一個函數來確定列表或字符串的長度。 我有點困惑為什么Haskell確定類型類是Num。 當然字符串不包含在這個類中? 但是Haskell堅持認為必須這樣,否則函數將無效。 有人可以幫助澄清這是為什么嗎?

myLength' :: (Num a) => [a] -> Int
myLength' xs = foldr (\x acc -> 1 + acc) 0 xs

我認為您的類型簽名可能因您的聲明而過於具體。 這是我在GHCi中得到的:

> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b

> :t foldr (\x acc -> acc + 1)
... :: Num b => b -> [a] -> b

+Num約束的來源。 它僅適用於類型b因為acc的類型與b結合。 沒有進一步的限制因為我們沒有用x :: a做任何事情。

> :t foldr (\x acc -> acc + 1) 0
... :: Num b => [a] -> b

0很容易與Num b => b統一,除了我們掉箭之外沒什么變化。

> :t \xs -> foldr (\x acc -> acc + 1) 0 xs
... :: Num b => [a] -> b

我們引入了一個沒有特定類型的參數xs ,它很容易與[a]統一起來。 沒有什么變化。 所以我們的最終類型應該是

myLength :: (Num b) => [a] -> b
myLength = foldr (\_ acc -> 1 + acc) 0

確實適用於字符串。 myLength "hello" => 5等等。

李評價所提到的, foldr的類型在GHC 7.10改變為Foldable t => (a -> b -> b) -> b -> ta -> b作為的一部分在前奏提案可折疊Traversable的 ,這允許foldr用於許多不同的數據結構而不是單獨的列表。 在GHC 7.10上,你的函數確實會有myLength :: (Foldable t, Num b) => ta -> b的類型推斷。 注意(Foldable t) => ta概括[a]

HOORAY TYPES

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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