如何在Haskell中组合两个列表

时间:2017-04-16 09:22:45

标签: haskell

我想列出这样的列表:

[1,2,3] [4,5,6] - > [[1,2,3],4,5,6]

这就是我现在所拥有的:

combine :: [a] -> [a] -> [[a]]
combine xs ys = [xs,ys]

但是这段代码给了我:[[1,2,3],[4,5,6]]并不是我需要的。

2 个答案:

答案 0 :(得分:6)

正如m0nhawk在评论中所写,你不能直接拥有整数和整数列表的Haskell列表。但是,有几种选择。

一种替代方案确实是使用整数列表([[1, 2, 3], [4], [5], [6]]),如下所示:

combine:: [Int] -> [Int] -> [[Int]]
combine xs ys = [xs] ++ [[y] | y <- ys] 

main = do
    putStrLn $ show $ combine [1, 2, 3] [4, 5, 6]               

(运行此确实会打印[[1, 2, 3], [4], [5], [6]])。

另一种方法是使用algebraic data types

Prelude> data ScalarOrList = Scalar Int | List [Int] deriving(Show)
Prelude> [List [1, 2, 3], Scalar 4, Scalar 5, Scalar 6]
[List [1,2,3],Scalar 4,Scalar 5,Scalar 6]

答案 1 :(得分:3)

Haskell中的等异类列表,但它们并不是特别琐碎或对初学者友好:

https://hackage.haskell.org/package/hvect-0.4.0.0/docs/Data-HVect.html

这也很好看:https://wiki.haskell.org/Heterogenous_collections

你可能最好试着看看你是否可以创建自己的数据类型来封装简单的值和值列表:

data IntOrList = AnInt Int | AList [Int]

但是你必须解开你的值,这可能是一个你不想处理的附加层。至少他们都能够共享一个列表:someList = [AnInt 5, AnInt 7, AList [1, 2, 5, 8], AnInt 2]