Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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 as模式的功能,通过'的非重叠模式;as模式';_Haskell_Design Patterns_Overlapping Matches_As Pattern - Fatal编程技术网

Haskell as模式的功能,通过'的非重叠模式;as模式';

Haskell as模式的功能,通过'的非重叠模式;as模式';,haskell,design-patterns,overlapping-matches,as-pattern,Haskell,Design Patterns,Overlapping Matches,As Pattern,我不熟悉函数式编程,尤其是haskell,对于模式和通过使用它减少重叠,我有两个问题。 给出以下代码示例: last1 :: [a] -> a last1 [x] = x last1 (x:xs) = last xs last2 :: [a] -> a last2 [y] = y last2 (y:ys@(_:_)) = last ys 与last2相比

我不熟悉函数式编程,尤其是haskell,对于模式和通过使用它减少重叠,我有两个问题。 给出以下代码示例:

last1 :: [a]          ->  a
last1    [x]          =   x
last1    (x:xs)       =   last xs

last2 :: [a]          ->  a
last2    [y]          =   y
last2    (y:ys@(_:_)) =   last ys
last2
相比,
last1
应该不重叠。 让我们看看特定的字符串
f:[]
。它将与
last1
中的
[x]
(x:xs)
匹配

last2
中,它将与
[y]
匹配。但是不要使用
(y:ys@(:))
,因为
ys
必须匹配
(:uu)
,并且只使用
[]
实现第一个任意模式

我的假设正确吗


现在看看特定的字符串
f:o:o:[]
。现在模式
(y:ys@(:))
匹配。在这种情况下,我很好奇绑定是如何工作的。第一次呼叫后的
ys
是什么?我假设它是
o:o:[]

在这两种情况下,您的递归都将是
last
,而不是
last1
/
last2

last2
相比,
last1
应该不重叠。 让我们看看特定的字符串
f:[]
。它将与
last1
中的
[x]
(x:xs)
匹配

它可以匹配
(x:xs)
,但不会匹配,因为模式匹配只匹配第一次成功。重叠在这方面并不含糊(始终采用第一个定义)

last2
中,它将与
[y]
匹配。但是不要使用
(y:ys@(:))
,因为
ys
必须匹配
(:uu)
,并且只使用
[]
实现第一个任意模式

你的措辞有点奇怪,但你是正确的,
f:[]
不能与
(y:ys@(:u))匹配,因为后者基本上与
(不匹配的
)匹配

现在看看特定的字符串
f:o:o:[]
。现在模式
(y:ys@(:))
匹配。在这种情况下,我很好奇绑定是如何工作的。第一次呼叫后的
ys
是什么?我假设它是
o:o:[]


ys
等于
o:o:[]
(或
“oo”
[o,o]
)。

在Haskell中,使用第一个匹配方程时,这两个函数是相同的。您的第二个函数更明确一些,但第一个函数更惯用。

为什么不
x1:x2:
?我看不出有任何理由在这里使用“as”模式。这是我的教授描述as模式和绑定的一个例子。但这与其说是一种解释,不如说是一种提及。@dredozubov:你怎么知道在你的例子中应该重复什么?@Guvante我的观点是:没有必要这样做subexpressions@dredozubov:您的示例会删除列表的其余部分,因此无法工作
x1:x2:xs
可以工作,但是
x1:x2:
无法在列表的其余部分重复出现,因此无法获取最后一项。