簡體   English   中英

模式的功能,通過“作為模式”的非重疊模式

[英]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應該不重疊。 讓我們看一下特定的String f:[] 它將匹配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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM