Haskell 如何在Frege中定义多个模式?
在中定义使用多个模式的函数时遇到一些问题。基本上,我是通过遍历元组列表来定义映射的。我将其简化为以下内容:Haskell 如何在Frege中定义多个模式?,haskell,frege,Haskell,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
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
我见过其他类似的例子在函数定义中使用多个模式,所以我不知道我做错了什么。为什么我会在这里出错?我是弗雷格的新手(也是哈斯克尔的新手),所以我可能遗漏了一些简单的东西,但我真的认为这不应该是个问题
我正在使用3.24-7.100版进行编译。这是一个纯粹的语法问题,会影响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
您可能需要在
(baz,zab):foobar
模式周围添加paren。像foobar((baz,zab):foobar)
这样的东西非常有意义。谢谢你的详细回答!