haskell - Haskell 中的任何类型?

标签 haskell types type-signature

我最近开始尝试通过阅读 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在谓词下或者它找不到这样的元素返回 TrueFalse在各自的情况下。 (实际的实现可能会有很大的不同。)

    例如 []是类型类 Foldable 的实例因此 t a可能是一些东西的 list 。在这种情况下,我们也可以写 [a]而不是 [] a .

    但是还有其他类型构造函数,它们可以是 Foldable 的实例。 ,例如某些种类的树。

    关于haskell - Haskell 中的任何类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46490606/

    相关文章:

    haskell - 了解 Haskell 类型签名

    haskell - 仍然混淆带有多个箭头的类型签名如何工作

    haskell - 从什么意义上说,一个函数的定义“定义”比另一个函数少?

    haskell - IncoherentInstances 如何工作?

    swift - 当子类中有覆盖函数时如何转换为父类(super class)

    haskell - 我这里的类型签名有什么问题?

    haskell - 为什么Type是一种有值的类型?

    haskell - 为什么使用 applicative functors 不如 monads 进行整数除法?

    haskell - 输入没有意义的签名

    ios - RubyMotion >> 如何将变量转换为特定类型?