入力がリストの場合、リストの理解に問題があります。
これらすべてのIII演習では、次の使用は許可されていません: map
、filter
およびconcat
!!!
パートI
要件:
関数は、型が
型であるトリプルf1
のリストを取得しますxs
(a, b, cs)
a
b
Int
c
[Int]
関数はペアのリストを生成する必要があります(a · b, b + c)
。cs のすべての c AND 生成されたリストには、最初の要素が 2 番目の要素よりも大きいペアのみが表示される必要があり(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)]
2番目のアプローチ:
f1 let (a, b, cs) = xs = [(a*b, b+c)| c<-cs, (a*b)>(b+c)]
3番目のアプローチ:
f1 (a b cs) = [(a*b, b+c)| c<-cs, (a*b)>(b+c)]
3つすべてが機能しません!
dave4420 による解決策:
f1 :: [(Int, Int, [Int])] -> [(Int, Int)]
f1 xs = [ (a*b, b+c) | (a, b, cs) <- xs, c <- cs, (a*b)>(b+c) ]
パート II
要件:
関数 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]
これも手伝ってくれませんか?
もう一度ありがとう
第三部がやってくる…