如何反转列表然后使用反向列表

时间:2016-02-21 06:56:22

标签: haskell

我试图在Haskell中反转列表,然后使用反向列表并对其进行一些工作,但我不知道如何,因为Haskell选择了第三行并忽略了我的最后一行代码行

注意:我知道模式匹配重叠,但我不知道如何修复它。

这就是我所拥有的:

let blackView = UIView()
blackView.frame = view.frame
let mask = CAShapeLayer()
mask.path = UIBezierPath(ovalInRect: CGRectInset(view.frame, 30, 30)).CGPath
blackView.layer.mask = mask

我尝试使用test :: (a -> Bool) -> [a] -> [a] test _ [] = [] test _ (x:xs) = reverse xs ++ [x] test func (x:xs) 这样的句子:

where

但它看起来并不接受它。

2 个答案:

答案 0 :(得分:1)

备注:

正如@chi刚刚指出的那样,类型/功能

有些可疑

所以你想要过滤使用得到的地图 - 我假设后者(正如你所说的那样),但你的签名暗示了前者。

我将编辑帖子并将第一个版本加上

当你像这样进行模式匹配时:

test _ (x:xs)
test func (x:xs)

然后两条线都会匹配相同的东西 - 唯一的区别在于 在后一种情况下,您在第一个参数中命名了第一个参数(func) 你说我不需要这个功能

当Haskell从上到下匹配时,你永远不会看到最后一行 所以你永远不会到达它的右侧

所以

test :: ([a] -> b) -> [a] -> b
test f []     = f []
test f (x:xs) = f (reverse xs ++ [x])

或(过滤器版本)

test :: (a -> Bool) -> [a] -> [a]
test _ []     = []
test f (x:xs) = filter f (reverse xs ++ [x])

会有效(虽然解构为(x:xs)甚至是。{ 第一个案例并不是真的需要,因为@foo评论了)

where的想法是一个很好的步骤,但你尝试将它与模式匹配列表混合(你必须在这里 - reverse会为你做的):

test :: ([a] -> b) -> [a] -> b
test f xs = f xs'
    where xs' = reverse xs

过滤器版本:

test :: (a -> Bool) -> [a] -> [a]
test f xs = filter f xs'
    where xs' = reverse xs

当然,一旦你有这个,你可能会看到你可以使用 组成也是:

test f xs = f (reverse xs) = (f . reverse) xs

过滤版本

test f xs = filter f (reverse xs) = (filter f . reverse) xs

这样你就可以写

test f = f . reverse

过滤

test f = filter f . reverse

也是

btw:在这里你可以看到我的意思

  

将你的警卫放在f

在我的评论中,好像您实施了第一个版本,然后只需将f替换为filter g g,其中df是您的后卫,就获得第二个版本

答案 1 :(得分:1)

在进一步处理之前反转列表的最简单方法是使用辅助函数:

func f xs = func' f (reverse xs)
  where
    func' _ [] = ...
    func' f (x:xs) = ...

(请注意,撤消空列表是一项无操作,因此您无需在func专门处理它。)