如何在弗雷格定义多个模式?

时间:2017-02-11 08:16:48

标签: haskell frege

我在使用多个模式的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进行编译。

1 个答案:

答案 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