Haskell 如何撤销列表,然后使用撤销的列表
我试图在Haskell中反转一个列表,然后使用反转的列表并对其进行一些处理,但我不知道如何操作,因为Haskell选择第三行并忽略我的最后一行代码 注意:我知道我有模式匹配重叠,但我不知道如何修复它。 这就是我所拥有的:Haskell 如何撤销列表,然后使用撤销的列表,haskell,Haskell,我试图在Haskell中反转一个列表,然后使用反转的列表并对其进行一些处理,但我不知道如何操作,因为Haskell选择第三行并忽略我的最后一行代码 注意:我知道我有模式匹配重叠,但我不知道如何修复它。 这就是我所拥有的: test :: (a -> Bool) -> [a] -> [a] test _ [] = [] test _ (x:xs) = reverse xs ++ [x] test func (x:xs) 我尝试使用where子句,如下所示: test :: (a
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test _ (x:xs) = reverse xs ++ [x]
test func (x:xs)
我尝试使用where
子句,如下所示:
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test func (x:xs)
| some code here
| some code here
where test _ (x:xs) = reverse xs ++ [x]
test _ (x:xs)
test func (x:xs)
但它似乎不接受它。备注:
正如@chi刚刚指出的,类型/函数有些可疑
所以你要么想过滤,要么使用结果图——我假设是后者(正如你所说的),但你的签名表明是前者
我会编辑这篇文章,也会放在第一个版本上
当您这样进行模式匹配时:
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test func (x:xs)
| some code here
| some code here
where test _ (x:xs) = reverse xs ++ [x]
test _ (x:xs)
test func (x:xs)
然后两行将匹配相同的东西-唯一的区别是
后一种情况是在第一个参数中命名第一个参数(func
)
你说我不需要这个功能
哈斯凯尔自上而下地比赛,你永远看不到最后一行
所以你永远也不会走到正确的一面
所以
或(过滤器版本)
虽然分解成(x:xs)
甚至
第一个案例并非如@foo所说的那样真正需要)
使用
where
的想法是一个很好的步骤,但您尝试将其与匹配列表的模式混合使用(您根本不需要在此处使用反转即可):
或筛选器版本:
当然,一旦你有了这个,你可能会发现你可以使用
组成也包括:
test f xs = f (reverse xs) = (f . reverse) xs
或过滤器版本
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test f (x:xs) = filter f (reverse xs ++ [x])
这样你就可以写作了
test f = f . reverse
或过滤
相反,也
顺便说一句:在这里,你可以看到我的意思
只要把你的警卫放在f
里就行了
在我的评论中,如果您实现了第一个版本,那么您只需将f
替换为filter g
,就可以得到第二个版本,其中g
是您的卫士备注:
正如@chi刚刚指出的,类型/函数有些可疑
所以你要么想过滤,要么使用结果图——我假设是后者(正如你所说的),但你的签名表明是前者
我会编辑这篇文章,也会放在第一个版本上
当您这样进行模式匹配时:
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test func (x:xs)
| some code here
| some code here
where test _ (x:xs) = reverse xs ++ [x]
test _ (x:xs)
test func (x:xs)
然后两行将匹配相同的东西-唯一的区别是
后一种情况是在第一个参数中命名第一个参数(func
)
你说我不需要这个功能
哈斯凯尔自上而下地比赛,你永远看不到最后一行
所以你永远也不会走到正确的一面
所以
或(过滤器版本)
虽然分解成(x:xs)
甚至
第一个案例并非如@foo所说的那样真正需要)
使用where
的想法是一个很好的步骤,但您尝试将其与匹配列表的模式混合使用(您根本不需要在此处使用反转即可):
或筛选器版本:
当然,一旦你有了这个,你可能会发现你可以使用
组成也包括:
test f xs = f (reverse xs) = (f . reverse) xs
或过滤器版本
test :: (a -> Bool) -> [a] -> [a]
test _ [] = []
test f (x:xs) = filter f (reverse xs ++ [x])
这样你就可以写作了
test f = f . reverse
或过滤
相反,也
顺便说一句:在这里,你可以看到我的意思
只要把你的警卫放在f
里就行了
在我的评论中,如果您实现了第一个版本,那么您只需将f
替换为filter g
即可获得第二个版本,其中g
是您的保护在进一步处理之前,反转列表的最简单方法是使用帮助函数:
func f xs = func' f (reverse xs)
where
func' _ [] = ...
func' f (x:xs) = ...
(请注意,反转空列表是不可操作的,因此不需要在func
中专门处理它)在进一步处理之前反转列表的最简单方法是使用帮助器函数:
func f xs = func' f (reverse xs)
where
func' _ [] = ...
func' f (x:xs) = ...
(请注意,撤销空列表是不可行的,因此您不需要在func
中专门处理它)我理解您的代码,但它并不能解决问题,这里的要点是,我正在尝试撤销我得到的列表,然后应用防护,所以,当你测试f xs=f xs‘where xs’=reverse xs时,你就不会再应用保护了只要把你的保护放在任何f
的地方就行了——但也许我弄错了——你为什么不把你真正想做的事发出来呢?在第一次尝试中,您根本没有任何防护措施。请注意,f::a->Bool
不接受列表。要么OP的类型是错误的,要么OP完全是其他意思。@chi-true。。。我完全错过了这个对不起(我的坏)-我甚至复制和粘贴。。。多克,这就是我想要做的@Carsten。所以我的第二个输入将是一个列表,我需要先反转该列表,然后用答案,即反转列表,检查一些保护条件,例如:如果我的第二个输入为[1,2,3,4,5],我需要先反转它,得到[5,4,3,2,1],然后检查这个反转列表在第二个索引处是否有奇数,希望这能澄清abiti理解你的代码,但这并不能解决问题,这里的重点是,我试图扭转我得到的列表,然后应用防护,所以,当你测试f xs=f xs‘where xs’=reverse xs时,你就不会再应用保护了只要把你的保护放在任何f
的地方就行了——但也许我弄错了——你为什么不把你真正想做的事发出来呢?在第一次尝试中,您根本没有任何防护措施。请注意,f::a->Bool
不接受列表。要么OP的类型是错误的,要么OP完全是其他意思。@chi-true。。。我完全错过了这个对不起(我的坏)-我甚至复制和粘贴。。。多克,这就是我想要做的@Carsten。因此,我的第二个输入将是一个列表,我需要首先反转该列表,然后使用答案,即反转列表,检查一些保护条件,例如:如果我的第二个输入是[1,2,3]