Int but got Int*Int->Int"-6ren"> Int but got Int*Int->Int"-评论 Steve Yegge的post关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述: ... examples from H-M style-6ren">
gpt4 book ai didi

haskell - 理解类型错误 : "expected signature Int*Int->Int but got Int*Int->Int"

转载 作者:行者123 更新时间:2023-12-04 05:44:54 32 4
gpt4 key购买 nike

评论 Steve Yeggepost关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述:

... examples from H-M style systems where you can get things like:

expected signature Int*Int->Int but got Int*Int->Int


你能举一个函数定义的例子(或两个?)和一个会产生该错误的函数调用吗?看起来在大型程序中调试可能非常困难。

另外,我可能在 Miranda 中看到过类似的错误吗? ? (我已经 15 年没用过了,所以我对它的内存很模糊)

最佳答案

我对 Yegge(和 Ola Bini)关于静态类型的观点持保留态度。如果您欣赏静态类型为您提供的东西,您将了解您选择的编程语言的类型系统是如何工作的。

IIRC,ML 对元组使用 '*' 语法。 * 是一个有两个元素的元组类型。因此, (1, 2) 将具有 int * int 类型。

Haskell 和 ML 都使用 -> 作为函数。在 ML 中,int * int -> int 将是一个函数的类型,它接受一个 int 和 int 的元组并将其映射到一个 int。

您可能会看到一个看起来与 Ola 在从另一种语言进入 ML 时引用的错误类似的错误的原因之一是,如果您尝试使用括号和逗号将参数传递给一个函数,就像在 C 或 Pascal 中那样,接受两个参数。

问题是,函数式语言通常将多个参数的函数建模为函数返回函数。所有函数只接受一个参数。如果函数应该接受两个参数,则它会接受一个参数并返回一个具有单个参数的函数,该函数返回最终结果,依此类推。为了使所有这些清晰易读,函数应用只需通过连词即可完成(即将表达式并排放置)。

因此,ML 中的一个简单函数(注意:我使用 F# 作为我的 ML)可能看起来有点像:

let f x y = x + y;;

它有类型:
val f : int -> int -> int

(一个接受整数并返回一个函数的函数,该函数本身接受一个整数并返回一个整数。)

但是,如果你天真地用元组调用它:
f(1, 2)

...你会得到一个错误,因为你将一个 int*int 传递给期望一个 int 的东西。

我认为这是 Ola 试图中伤的“问题”。不过,我认为问题并没有他想的那么严重。当然,在 C++ 模板中情况要糟糕得多。

关于haskell - 理解类型错误 : "expected signature Int*Int->Int but got Int*Int->Int",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/324612/

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