gpt4 book ai didi

haskell - 学习 Haskell 映射、折叠、循环和递归

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

我刚刚涉足 Haskell 的世界,这是我编程启蒙之旅的一部分(从过程式到 OOP,再到并发,再到现在的函数式)。

我一直在尝试在线 Haskell Evaluator .

但是我现在遇到了一个问题:

创建一个简单的函数,给出一组数字的总和。

在过程语言中,这对我来说很容易(使用递归)(c#):

private int sum(ArrayList x, int i)
{
if (!(x.Count < i + 1)) {
int t = 0;

t = x.Item(i);
t = sum(x, i + 1) + t;
return t;
}
}

一切都很好,但是我在 Haskell 上的失败尝试是这样的:

let sum x = x+sum  in map sum [1..10]

这导致了以下错误(来自上述网站):

Occurs check: cannot construct the infinite type: a = a -> t

请记住我只在过去 30 分钟内使用过 Haskell!

我不是简单地寻找答案,而是寻找更多的解释。

最佳答案

I'm not looking simply for an answer but a more explanation of it.

在 = 的左侧,您使用 sum 作为应用于 x 的函数。编译器不知道x的类型,因此编译器使用类型变量a来代表“x的类型”。此时编译器也不知道函数 sum 的结果类型,因此它选择另一个类型变量,即此类型 t 来代表结果类型。现在,在左侧,编译器认为 x 的类型是 a -> t (函数接受 a 并返回 t)。

在 = 的右侧添加 xsum。在 Haskell 中,所有类型的数字都可以相加,但只有当两个数字具有相同类型时才可以相加。所以这里编译器假设 sumx 具有相同的类型,即类型 a

但是在 Haskell 中,标识符只有一种类型——也许是一种非常复杂的类型,但仍然是一种类型。这包括 sum,` 符号两边的类型应该相同,因此编译器会尝试求解方程

a = a -> t

at 没有值可以解这个方程。这根本不可能完成。不存在 a 使得 a 等于接受自身作为参数的函数。因此出现错误消息

cannot construct the infinite type: a = a -> t

即使有了所有的解释,这也不是一个很好的错误消息,不是吗?

欢迎来到 Haskell :-)

<小时/>

附注您可能会喜欢尝试“Helium,用于学习 Haskell”,它为初学者提供了更好的错误消息。

关于haskell - 学习 Haskell 映射、折叠、循环和递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3034004/

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