0

入力がリストの場合、リストの理解に問題があります。

これらすべてのIII演習では、次の使用は許可されていません: mapfilterおよびconcat!!!


パートI

要件:

関数は、型が 型であるトリプルf1のリストを取得しますxs(a, b, cs)abInt 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]

これも手伝ってくれませんか?

もう一度ありがとう

第三部がやってくる…

4

3 に答える 3

1

あなたはそこへの道の90%です。GHCI ではlet定義の前に使用しますが、通常のソース コード内では使用しないことに注意してください。それでは、これまでの内容を見てみましょう。

λ> let f1 (a,b,cs) = [(a*b, b+c)| c<-cs, (a*b)>(b+c)]

タプルにコンマを追加したことに注意してください。の種類を調べてみましょうf1

λ> :t f1
f1 :: (Num t, Ord t) => (t, t, [t]) -> [(t, t)]

今のところ、この(Num t, Ord t) =>部分は無視してかまいません。これは、要素、別の要素、および要素のリストを含むタプルを取る関数です。したがって、タプルのリスト全体を渡すことはできず、単一のタプルのみを渡すことができます。

λ> f1 (10,20,[1,10,100])
[(200,21),(200,30),(200,120)]
λ> f1 (4,5,[5,15,25])
[(20,10)]

それは、あなたが望む結果の最初の部分です。

λ> f1 (4,5,[5,15,25])
[(20,10)]

そして、それが第二部です。したがって、次のような入力を受け取る別の関数が必要になります。

[(10,20,[1,10,100]),  (4,5,[5,15,25])]

つまり、タプルのリストを取る関数が必要です。に基づいてf1、次のように記述できます。

λ> let f2 xs = [f1 x | x <- xs]
λ> f2 [(10,20,[1,10,100]),  (4,5,[5,15,25])]
[[(200,21),(200,30),(200,120)],[(20,10)]]

結果はリストのリストであり、単純なリストが必要であることに注意してください。を使用することは許可されていないためconcat、Groovy または Daniel Fisher が問題にどのようにアプローチしたかを見てください。2 つの異なる方法、どちらも優れています。

于 2013-05-14T18:22:15.623 に答える