Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何在Frege中定义多个模式?_Haskell_Frege - Fatal编程技术网

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)
这样的东西非常有意义。谢谢你的详细回答!