gpt4 book ai didi

haskell - 模式匹配时不同数量的参数可能

转载 作者:行者123 更新时间:2023-12-04 21:56:46 25 4
gpt4 key购买 nike

我遇到了一个我不太明白的问题。我以为我可以在 Haskell 中编写这样的代码:

foo :: Maybe Int -> Int
foo Nothing = 0
foo Just x = x

但是当我尝试编译它时,我收到错误:

Equations for ‘foo’ have different numbers of arguments



我可以通过将代码更改为以下内容来修复它:
foo :: Maybe Int -> Int
foo Nothing = 0
foo (Just x) = x

这让我觉得GHC在解释 Just作为 foo 的参数.但是 Haskell 禁止使用大写字母作为变量名的开头,所以我认为这里不应该有任何歧义。这是怎么回事?

最佳答案

你是对的,关于是否Just没有歧义。是一个构造函数——但构造函数不能有参数! Haskell 的模式匹配不会查找涉及的名称,它是严格的语法,而且 foo Just x = x是一个完美格式的函数定义子句。它的类型错误:

Prelude> let foo Just x = x

<interactive>:2:9:
Constructor ‘Just’ should have 1 argument, but has been given none
In the pattern: Just
In an equation for ‘foo’: foo Just x = x

但是周围有不同的数据类型,那就没问题了:
Prelude> data Justice = Just
Prelude> let foo Just x = x
Prelude> :t foo
foo :: Justice -> t -> t
Prelude> foo Just ()
()
Just可能是一个空构造函数(如第二个例子),并且由于函数应用程序是左关联的,编译器解析 Justx作为单独的参数,您会收到“不同数量的参数”错误。 (正如您在上面看到的,如果没有 Nothing 情况,您实际上会得到该形式代码的类型错误。)

关于haskell - 模式匹配时不同数量的参数可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29886844/

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