如何在哈斯克尔中组合两个列表



我想列出这样的列表:

[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]],这不是我需要的。

正如 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]](。


另一种选择是使用代数数据类型:

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]

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]

最新更新