我自学 Haskell 已经有一个月左右了,今天我在阅读第 16 题的解答时想到了一个问题。
以下是链接:http://www.haskell.org/haskellwiki/99_questions/Solutions/16 基本上,这个问题要求编写一个函数,从列表中删除每个第 N 个元素。例如,
我的问题是为什么dropEvery定义了空列表的情况,而dropEvery'可以处理空列表? 我认为可以简单地消除
可以有人帮我弄清楚这个吗?
以下是链接:http://www.haskell.org/haskellwiki/99_questions/Solutions/16 基本上,这个问题要求编写一个函数,从列表中删除每个第 N 个元素。例如,
*Main> dropEvery "abcdefghik" 3
"abdeghk"
链接中的第一个解决方案为:dropEvery :: [a] -> Int -> [a]
dropEvery [] _ = []
dropEvery (x:xs) n = dropEvery' (x:xs) n 1
where
dropEvery' (x:xs) n i = (if (n `divides` i) then [] else [x])++ (dropEvery' xs n (i+1))
dropEvery' [] _ _ = []
divides x y = y `mod` x == 0
我的问题是为什么dropEvery定义了空列表的情况,而dropEvery'可以处理空列表? 我认为可以简单地消除
dropEvery [] _ = []
,并将其他句子稍微修改如下,就可以完全与上面的代码相同,并且看起来更短。dropEvery :: [a] -> Int -> [a]
dropEvery xs n = dropEvery' xs n 1
where
dropEvery' (x:xs) n i = (if (n `divides` i) then [] else [x])++ (dropEvery' xs n (i+1))
dropEvery' [] _ _ = []
divides x y = y `mod` x == 0
可以有人帮我弄清楚这个吗?
Int -> [a] -> [a]
,在管道情况下通常更有用。为什么在该示例中将其放置在另一侧,我不知道。 - leftaroundabout