繁体   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