如何在 Frege 中定义多个模式?

How to define multiple patterns in 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 版本进行编译。

这是一个纯粹的句法问题,会影响 Haskell 家族语言的新手。很快您就会内化函数应用程序的优先级高于中缀表达式的规则。

这会产生后果:

  • 函数应用的复杂参数需要括号。
  • 在中缀表达式中,运算符两边的函数应用不需要括号(但是,函数应用的个别组件可能仍然需要它们)。

此外,在弗雷格那里,还有如下规则成立:

The syntax of function application and infix expressions on the left hand side of a definition is identical to the one on the right hand side as far as lexemes allowed on both sides are concerned. (This holds in Haskell only when @ and ~ are not used.)

这样你就可以像这样定义一个加法函数:

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