我试图在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
但它看起来并不接受它。
答案 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
专门处理它。)