如何在 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
我在 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