gpt4 book ai didi

haskell - 了解这个 Haskell 函数的类型

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

我是 Haskell 的新手,我对以下代码有疑问:

a x (b:bs) = a (b x) bs
a x b = x []

这些模式的一般类型是什么?

:info我得到: ([t1] -> t) -> [([t1] -> t) -> [t1] -> t] -> t
但是,我不明白为什么。是否 a是否只有两个“输入”?

最佳答案

I just have two "Inputs" or not?



是的,你有两个参数(技术上是一个,因为柯里化(Currying)的工作方式)。

With :info a I get: ([t1] -> t) -> [([t1] -> t) -> [t1] -> t] -> t



这意味着第一个参数的类型为 [t1] -> t (所以它是一个接受 t1 列表并产生 t 的函数),第二个参数的类型为 [([t1] -> t) -> [t1] -> t] (函数列表采用 [t1] -> t 类型的函数和 t1 的列表并产生 t ),结果的类型为 t .

But I cannot understand why.



让我们看一下代码:
a x (b:bs) =

第一个参数只是一个变量模式,所以它的类型是任何东西。第二个是列表模式,所以它必须是一个列表。

因此,如果我们使用带编号的问号来表示我们还不知道的类型,那么到目前为止我们知道以下内容:
x :: ?1
b :: ?2
bs :: [?2]
a :: ?1 -> [?2] -> ?3

现在让我们看看 body :
a (b x) bs
b应用于 x , 所以 b必须是采用 x 类型的函数作为它的参数。 b x 的结果用作 a 的第一个参数, 所以结果类型为 b还必须匹配 x 的类型.因此 ?2必须是 ?1 -> ?1我们得到:
x :: ?1
b :: ?1 -> ?1
bs :: [?1 -> ?1]
a :: ?1 -> [?1 -> ?1] -> ?3

现在让我们看看第二个正文( bbs 现在不再在范围内,技术上还有一个新的 b ,但它没有被使用,所以我们将忽略它):
x []

这里 x应用于空列表。所以它也必须是一个函数,它的参数类型是某种列表。由于 x [] 的结果也是 a 的结果, x的结果类型必须是 ?3 .所以我们得到 ?1 = [?4] -> ?3因此:
a :: ([?4] -> ?3) -> [([?4] -> ?3) -> ([?4] -> ?3)] -> ?3

由于 ->是右结合的,我们可以去掉最后的括号,得到:
a :: ([?4] -> ?3) -> [([?4] -> ?3) -> [?4] -> ?3] -> ?3

现在,既然这就是我们拥有的所有类型信息,那么剩下的所有问号都是实际类型变量,所以我们可以用任意类型变量名称替换它们。如果我们选择 ?3 = t?4 = t1 ,我们得到 info 的精确输出(但当然我们可以将它们命名为其他任何名称,并且类型仍然是等效的)。

关于haskell - 了解这个 Haskell 函数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052538/

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