我在使用多个模式的Frege中定义函数时遇到了一些麻烦。基本上,我通过迭代元组列表来定义映射。我把它简化为以下内容:
foo :: a -> [(a, b)] -> b
foo _ [] = [] --nothing found
foo bar (baz, zab):foobar
| bar == baz = zab
| otherwise = foo bar foobar
我收到以下错误:
E morse.fr:3: redefinition of `foo` introduced line 2
我见过像this这样的其他例子在函数定义中使用了多个模式,所以我不知道我做错了什么。为什么我在这里收到错误?我是Frege的新手(也是Haskell的新手),所以可能有一些我想念的简单,但我真的不认为这应该是个问题。
我正在使用版本3.24-7.100进行编译。
答案 0 :(得分:2)
这是一个纯粹的语法问题,会影响Haskell家族语言的新手。在内部化函数应用程序具有比中缀表达式更高优先级的规则之前,不会花太长时间。
这有后果:
此外,在弗雷格,以下规则成立:
定义左侧的函数应用程序和中缀表达式的语法与右侧的语法相同,只要涉及双方允许的词汇量。 (仅当未使用
@
和~
时才在Haskell中保留。)
这样你可以定义一个这样的加法函数:
data Number = Z | Succ Number
a + Z = a
a + Succ b = Succ a + b
因此,当您将此应用于您的示例时,您会在语法上看到,您将重新定义:
运算符。为了实现你想要的,你需要这样写:
foo bar ((baz, zab):foobar) = ....
-- ^ ^
这相当于您将foo
应用于您正在构建的列表的情况:
foo 42 (x:xs)
写作时
foo 42 x:xs
这意味着
(foo 42 x):xs