使用as-patterns不绑定到Haskell中的完整List

byr*_*sos 5 haskell haskell-platform

好吧,也许标题有点令人困惑,但我想要做的是有这样的功能:f (a:b:c:d:is) = ...但能够参考a:b:c:d而不再写它.事实证明,我不能做类似的事情e@(a:b:c:d):is并获得预期的结果.有任何想法吗?

Sjo*_*her 6

我能想到的最好的就是使用视图模式,如下所示:

{-# LANGUAGE ViewPatterns #-}
f (splitAt 4 -> (as@[a,b,c,d], is)) = is ++ [d,c,b,a] ++ as
Run Code Online (Sandbox Code Playgroud)


Dan*_*her 5

你不能这样做,一个原因是这a:b:c:d不是一个很好的表达方式.通过定义中的绑定f,a, b, c, d所有类型都具有相同的类型t,但是列表构造函数的类型是

(:) :: t -> [t] -> [t]
Run Code Online (Sandbox Code Playgroud)

你可以通过绑定来实现你想要的东西let foo = take 4 inputList.诚然笨重,但我无法想到任何更好的东西.