如果输入是列表,我对列表理解有一些问题。
在所有这些III练习中,不允许使用map
:filter
和concat
!!!
第一部分
要求:
一个函数f1
获取一个xs
三元组列表,(a, b, cs)
其中
类型a
和b
类型Int
c
是类型[Int]
该函数应该生成一个对的列表(a · b, b + c)
,因为 cs 中的所有 c 并且在生成的列表中应该只出现第一个元素大于第二个元素的那些对 - (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]
你能帮我解决这个问题吗?
再次感谢
第三部分来了……