Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 模式匹配相同值_Haskell_F#_Functional Programming_Pattern Matching_Guard Clause - Fatal编程技术网

Haskell 模式匹配相同值

Haskell 模式匹配相同值,haskell,f#,functional-programming,pattern-matching,guard-clause,Haskell,F#,Functional Programming,Pattern Matching,Guard Clause,我只是想知道是否有可能使用函数式编程语言(Haskell/F#/Caml)的模式匹配工具多次匹配相同的值 想想下面的例子: plus a a = 2 * a plus a b = a + b 当使用两个类似的值(存储在a中)调用函数时,将调用第一个变量 一个更有用的应用程序是(简化AST) 但是Haskell拒绝这些代码,并警告我a的定义存在冲突-我必须进行显式的case/if检查,以确定函数是否具有相同的值。有什么技巧可以表明我要匹配的变量会多次出现吗?不能用两个同名参数来表示它们应该相等,

我只是想知道是否有可能使用函数式编程语言(Haskell/F#/Caml)的模式匹配工具多次匹配相同的值

想想下面的例子:

plus a a = 2 * a
plus a b = a + b
当使用两个类似的值(存储在
a
中)调用函数时,将调用第一个变量

一个更有用的应用程序是(简化AST)


但是Haskell拒绝这些代码,并警告我
a
的定义存在冲突-我必须进行显式的case/if检查,以确定函数是否具有相同的值。有什么技巧可以表明我要匹配的变量会多次出现吗?

不能用两个同名参数来表示它们应该相等,但可以用它们来区分如下情况:

plus a b
  | a == b    = 2 * a
  | otherwise = a + b
这更灵活,因为它也适用于比简单等式更复杂的条件。

这称为非线性模式。不久前,haskell cafe的邮件列表上有好几条关于这一点的线索。这里有两个:

一句话:这并不是不可能实现的,但为了简单起见,决定不实现

顺便说一下,您不需要
if
case
来解决这个问题;(稍微)清洁的方法是使用防护装置:

a `plus` b
  | a == b = 2*a
  | otherwise = a+b

我刚刚查阅了Thomas的回答中给出的邮件列表线程,其中一个线程的第一个回答很有意义,并解释了为什么这样的“模式”通常没有多大意义:如果
a
是一个函数呢?(通常不可能检查两个函数是否相等。)

我实现了一种新的函数式编程语言,可以在Haskell中处理非线性模式

在我的语言中,您的
plus
功能如下所示

(define $plus
  (match-lambda [integer integer]
    {[[$a ,a] (* a 2)]
     [[$a $b] (+ a b)]}))

是的,我知道警卫,但我试图避免任何手动比较。这有点简写:FWIW,Mathematica支持这一点。它不能将
a
约束为
Eq
?@gdejohn,我怀疑语义不正确。当应用形式
fx=x
的定义时,我们可以合理地期望IMO两个提交的参数是相同的值,而不仅仅是在某种类型的意义上“相等”(否则,甚至不清楚
x
的两个值中应该返回哪个值)。
(define $plus
  (match-lambda [integer integer]
    {[[$a ,a] (* a 2)]
     [[$a $b] (+ a b)]}))