Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何撤销列表,然后使用撤销的列表_Haskell - Fatal编程技术网

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

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

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

这就是我所拥有的:

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]