[英]Functionality of as-pattern, non overlapping pattern through '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
last1
相比, last2
應該不重疊。 讓我們看一下特定的String f:[]
。 它將匹配last1
[x]
和(x:xs)
。
在last2
,它將與[y]
匹配。 但不要(y:ys@(_:_))
,因為ys
必須匹配(_:_)
並僅使用[]
滿足第一個模式。
我的假設正確嗎?
現在看一下特定的String f:o:o:[]
。 現在,模式(y:ys@(_:_))
匹配了。 在這種情況下,我很好奇綁定的工作方式。 什么是ys
的第一個電話后? 我假設它是o:o:[]
。
在這兩種情況下,遞歸都將last
,而不是last1
/ last2
。
last1
相比,last2
應該不重疊。 讓我們看一下特定的Stringf:[]
。 它將匹配last1
[x]
和(x:xs)
。
它可以匹配(x:xs)
但不會匹配,因為模式匹配只會匹配第一個成功。 在這方面,重疊並不是模棱兩可的(始終采用第一個定義)。
在
last2
,它將與[y]
匹配。 但不要(y:ys@(_:_))
,因為ys
必須匹配(_:_)
並僅使用[]
滿足第一個模式。
您的措辭有點奇怪,但是您正確地認為f:[]
無法與(y:ys@(_:_))
相匹配,因為后者基本上與_:_:_
相匹配,但這並不匹配。
現在看一下特定的String
f:o:o:[]
。 現在,模式(y:ys@(_:_))
匹配了。 在這種情況下,我很好奇綁定的工作方式。 什么是ys
的第一個電話后? 我假設它是o:o:[]
。
ys
等於o:o:[]
(或"oo"
或[o,o]
)。
在Haskell中,這兩個函數相同,因為使用了第一個匹配方程。 您的第二個功能對此較為明確,但第一個功能更慣用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.