我正在尝试更改haskell中的列表以在每个元素之间包括0。如果我们有初始清单,[1..20]那么我想将其更改为[1,0,2,0,3..20]
我想做的实际上是在每个函数上使用map,提取元素,然后将其添加到列表中并使用++[0]它,但不确定这是否正确。仍在学习haskell,因此可能会有错误。
我的代码:
x = map classify[1..20]
classify :: Int -> Int
addingFunction 0 [Int]
addingFunction :: Int -> [a] -> [a]
addingFunction x xs = [a] ++ x ++ xs
Run Code Online (Sandbox Code Playgroud)
您无法使用来执行此操作map。其基本属性之一map是其输出将始终具有与输入正好一样多的项,因为每个输出元素都对应一个输入,反之亦然。
但是,有一个具有必要功能的相关工具:
concatMap :: (a -> [b]) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)
这样,每个输入项可以产生零个或多个输出项。您可以使用它来构建所需的功能:
between :: a -> [a] -> [a]
sep `between` xs = drop 1 . concatMap insert $ xs
where insert x = [sep, x]
0 `between` [1..10]
[1,0,2,0,3,0,4,0,5,0,6,0,7,0,8,0,9,0,10]
Run Code Online (Sandbox Code Playgroud)
或更简洁的定义between:
between sep = drop 1 . concatMap ((sep :) . pure)
Run Code Online (Sandbox Code Playgroud)