我最近开始尝试通过阅读 LearnYouAHaskell 和互联网上的随机文章来学习 Haskell。
我很难理解更复杂的函数类型。
一些我理解的例子。
> :t map
map :: (a -> b) -> [a] -> [b]
它接受一个函数(它接受 a 并给出 b,即 a 和 b 可以是不同的类型)和 a 的列表并返回 b 的列表。
> :t fst
fst :: (a, b) -> a
接受 2 个元素的元组(允许不同的类型)并返回第一个。
> :t any
在更高的层面上,我理解
any
.它接受一个函数和一个列表,如果任何列表条目为该特定函数返回真,则返回真。我也在 Python 和 JavaScript 中使用过它。问题
any :: Foldable t => (a -> Bool) -> t a -> Bool
翻译成上面的。(a -> Bool)
是谓词。接受一个参数并返回真或假。 t a -> Bool
Bool 是 any 的最终结果。根据我的理解t和a分别代表谓词和列表。为什么它们不以 ->
分隔最佳答案
any :: Foldable t => (a -> Bool) -> t a -> Bool
这里
Foldable t
意味着,t
是类型类 Foldable
的实例.Foldable
是一个类型类,如果输入 t
是类型类 Foldable
的实例我们从 t a
得知签名的一部分或来自类型类的定义 Foldable
, 那 t
实际上是一个类型构造函数。所以
t a
是一种类型,因此 t a -> Bool
是一个函数,映射类型为 t a
的值至 Bool
.这个函数将是闭包,这将将谓词应用于
t a
类型值的每个“元素” , 直到找到一个,产生 True
在谓词下或者它找不到这样的元素返回 True
或 False
在各自的情况下。 (实际的实现可能会有很大的不同。)例如
[]
是类型类 Foldable
的实例因此 t a
可能是一些东西的 list 。在这种情况下,我们也可以写 [a]
而不是 [] a
.但是还有其他类型构造函数,它们可以是
Foldable
的实例。 ,例如某些种类的树。
关于haskell - Haskell 中的任何类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490606/