5

好的,也许标题有点混乱,但我想做的是有一个这样的功能:但无需再次编写f (a:b:c:d:is) = ...即可引用。a:b:c:d事实证明,我不能做类似的事情e@(a:b:c:d):is并得到预期的结果。有任何想法吗?

4

2 回答 2

6

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

{-# LANGUAGE ViewPatterns #-}
f (splitAt 4 -> (as@[a,b,c,d], is)) = is ++ [d,c,b,a] ++ as
于 2012-01-03T11:52:11.497 回答
5

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

(:) :: t -> [t] -> [t]

您可以通过 binding 来实现您想要的let foo = take 4 inputList。诚然笨重,但我想不出比我头上更好的东西了。

于 2012-01-03T11:51:06.827 回答