【发布时间】:2013-05-14 17:44:12
【问题描述】:
如果输入是一个列表,我对列表理解有一些问题。
在所有 III 练习中都不允许使用:map、filter 和 concat!!!
第一部分
要求:
一个函数f1 得到一个列表xs 三元组(a, b, cs) 其中
a 和 b 的类型为 Int
c 的类型为 [Int]
该函数应该生成一个对列表(a · b, b + c),对于所有 cs 中的 c AND 在生成的列表中应该只出现第一个元素大于第二个元素的那些对 - (a · b) > b + c。
示例:
f1 [(10,20,[1,10,100]), (4,5,[5,15,25])]
应该返回以下列表:
[(200,21),(200,30),(200,120),(20,10)]
我的尝试:
f1 :: Int -> Int -> [Int] -> [(Int, Int)]
f1 a b cs = [(a*b, b+c)| c<-cs, (a*b)>(b+c)]
它工作正常,但不适用于列表作为输入。
所以我尝试了几种方法,但不幸的是不是正确的:-(
f1 :: [(Int, Int, [Int])] -> [(Int, Int)]
第一种方法:
f1 xs = [((xs !! 0)*(xs !! 1), (xs !! 1)+c)| c<-(xs !! 2), ((xs !! 0)*(xs !! 1))>((xs !! 1)+c)]
第二种方法:
f1 let (a, b, cs) = xs = [(a*b, b+c)| c<-cs, (a*b)>(b+c)]
第三种方法:
f1 (a b cs) = [(a*b, b+c)| c<-cs, (a*b)>(b+c)]
这三个都不行!
dave4420 的解决方案:
f1 :: [(Int, Int, [Int])] -> [(Int, Int)]
f1 xs = [ (a*b, b+c) | (a, b, cs) <- xs, c <- cs, (a*b)>(b+c) ]
第二部分
要求:
函数 g1 获取相同类型对的列表并从中生成一个普通列表。
示例:
g1 [(1,2),(3,4),(5,6)] returns [1,2,3,4,5,6]
我的尝试:
g1 :: [(Int, Int)] -> [Int]
g1 xs = [a,b | (a,b)<-xs]
我得到一个编译错误,因为列表理解输出中的 a,b 没有正确的语法。
但是我可以返回 a 或 b 或例如a+b:
g1 xs = [a | (a,b)<-xs]
或
g1 xs = [a+b | (a,b)<-xs]
你能帮我解决这个问题吗?
再次感谢
第三部分来了……
【问题讨论】:
标签: list haskell list-comprehension let