帮助列表操作列表

时间:2010-12-17 17:55:31

标签: list haskell syntax

嗨,我是Haskell的新手。 我正在尝试做一个简单的任务。

test :: (RealFloat a) => a -> a  ->  [a]  
test xs ys= [ w : h: [] | w  <- xs, h <- ys]

我在这里收到错误。 (毫无疑问) 在这个任务中,我只是想绑定两个列表(例如:test [12.12] [14.14]) 并希望返回一个新的组合列表(例如:[12.12,14.14])

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

你的签名错了。尝试:

test xs ys = ...

然后在ghci:

> :t test
test :: [t] -> [t] -> [[t]]

你需要两个参数,都是列表,而不是单个元素的两个参数。

答案 1 :(得分:3)

Drakosha是对的。列表连接在Haskell中已经有一个运算符。

test :: (RealFloat a) => [a] -> [a]  ->  [a]  
test xs ys= xs ++ ys

您可能不希望在此处使用列表推导,除非您想要提取第一个和第二个列表中的每个元素并使用它们执行某些操作。例如,笛卡尔积:

list1 = [1.0,1.1,1.2] :: [Double]
list2 = [2.0,2.1,2.2] :: [Double]

testComps xs ys = [(x,y) | x <- xs, y <- ys]

或者补充:

testComps2 xs ys = [ x + y | x <- xs, y <- ys]

甚至创建列表:

testComps3 xs ys = [x : y  : [] | x <- xs, y <- ys]

在GHCi中,这将产生以下结果:

*Main> testComps list1 list2
[(1.0,2.0),(1.0,2.1),(1.0,2.2),(1.1,2.0),(1.1,2.1),(1.1,2.2),(1.2,2.0),(1.2,2.1)
    ,(1.2,2.2)]
*Main> testComps2 list1 list2
[3.0,3.1,3.2,3.1,3.2,3.3000000000000003,3.2,3.3,3.4000000000000004]
*Main> testComps3 list1 list2
[[1.0,2.0],[1.0,2.1],[1.0,2.2],[1.1,2.0],[1.1,2.1],[1.1,2.2],[1.2,2.0],[1.2,2.1]
    ,[1.2,2.2]]

当你处理浮点数时,testComps2中的奇怪结果当然是正常的结果。在现实世界中,你可以通过四舍五入来弥补这一点。

您将遇到的另一个问题是(++)和(:)之间的区别。简单地说,(:)将单个项目添加到列表中,而(++)将两个列表连接起来。

答案 2 :(得分:1)

您需要列表连接:

[12.12] ++ [14.14]

=> [12.12,14.14]