gpt4 book ai didi

Haskell 为什么是 [fst,snd]::[(a,a) -> a]

转载 作者:行者123 更新时间:2023-12-04 03:36:36 26 4
gpt4 key购买 nike

我正在学习 Haskell,想知道为什么

[fst,snd] :: [(a,a) -> a]

我最初写的
[fst,snd] :: [(a,b) -> a, (c, d) -> d]

我不明白为什么会这样;有人可以解释一下吗?

谢谢

最佳答案

关键是,在 Haskell 中,列表是一种同构数据结构(当然,您可以有异构列表,但这是另一回事)。因此,当您将多态函数用作列表元素时,它们应该具有相同的类型。

在您的情况下,您使用的是 fst :: (a , b) -> asnd :: (a, b) -> b作为列表元素,它们 必须有相同的类型。为了确保这些类型的相同性,类型推断求助于一阶统一。统一

 (a , b) -> a


 (a , b) -> b

我们注意到以下替换使这些类型相等是
 [b +-> a] -- means substitute occurrences of b for a

将它应用于这两种类型,我们得到
 (a,a) -> a

正如 Haskell 告诉你的那样。

关于Haskell 为什么是 [fst,snd]::[(a,a) -> a],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35576239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com