开发者

Help on a list manipulating list

Hi I am a newbie in Haskell. I am trying to do a simple task.

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

I am getting an error here. (with out a doubt) In this task, I am simply trying to bind two 开发者_如何学Pythonlists (ex: test [12.12] [14.14]) and hopefully return a new combined list (ex: [12.12,14.14])

thanks for your help


Your signature is wrong. Try:

test xs ys = ...

then in ghci:

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

You need two arguments, both are lists, not two arguments of single elements.


Drakosha is correct. List concatenation already has an operator in Haskell.

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

You probably don't want to use a list comprehension here, unless you want to extract every element in your first and second list and do something with them. For example, a Cartesian Product:

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]

Or addition:

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

Or even creating lists:

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

In GHCi, this will yield the following:

*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]]

The weird results in testComps2 is, of course, normal cruft when you're dealing with floating-point numbers. In the real world you'd compensate for this by rounding.

Another problem you'll run into is the difference between (++) and (:). Simply put, (:) tacks individual items onto a list, whereas (++) concatenates two lists.


You need list concatenation:

[12.12] ++ [14.14]

=> [12.12,14.14]
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜