nob*_*ody 8 recursion haskell pattern-matching
所以我想在Haskell中做一个简单的字符串反向函数
swapReverse :: String => String
swapReverse [x] = [x]
swapReverse [x,y] = [y,x]
swapReverse (x:xs:l) = -- pattern match fails here
let last = [l]
middle = xs
first = [x]
in last ++ swapReverse middle ++ first
Run Code Online (Sandbox Code Playgroud)
那么有没有办法在haskell中定义一个具有first
和last
元素的模式结构,以及middle
?中的所有元素?
你不能.为什么?因为模式匹配匹配值及其子部分,但列表的"中间"不是列表的子部分.该列表[1, 2, 3, 4]
是1:(2:(3:(4:[])))
在其结构方面.所以你想匹配first
to 1
和last
to 4
,它们都是列表的子部分,因此不会被取消资格.但是middle
你想要的是2:(3:[])
,这不是列表的子部分,因此,不能匹配.
请注意,我们无法编写模式以同时匹配列表的第一个和最后一个元素.模式的深度在编译时固定.
模式匹配适用于构造函数,:是唯一的列表构造函数,因此您无法在列表的中间进行匹配.你需要向后构建新的列表(显然:)),这可以通过取头并将其附加到列表其余部分的反向来完成.