Haskell模式匹配第一个,中间部分和最后一个

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中定义一个具有firstlast元素的模式结构,以及middle?中的所有元素?

Lui*_*las 6

你不能.为什么?因为模式匹配匹配值及其子部分,但列表的"中间"不是列表的子部分.该列表[1, 2, 3, 4]1:(2:(3:(4:[])))在其结构方面.所以你想匹配firstto 1lastto 4,它们都是列表的子部分,因此不会被取消资格.但是middle你想要的是2:(3:[]),这不是列表的子部分,因此,不能匹配.

请注意,我们无法编写模式以同时匹配列表的第一个和最后一个元素.模式的深度在编译时固定.


Ada*_*ark 5

模式匹配适用于构造函数,:是唯一的列表构造函数,因此您无法在列表的中间进行匹配.你需要向后构建新的列表(显然:)),这可以通过取头并将其附加到列表其余部分的反向来完成.

  • 我只想说第三种模式,`(x:xs:l)`实际上可以匹配,但不是你所期望的.它将`x`与第一个元素匹配,`xs`与第二个元素匹配,`l`与列表的其余部分匹配. (2认同)