2016-04-18 10 views
0

私は現在、私が持っているhaskellコースの小規模な練習問題に取り組んでいます。それは次のように尋ねる:intリストのリストの二乗和を返す関数haskellを作成しますか?

は、パラメータとしてintのリストのリストを取りsumSquareMaxと呼ばれるHaskellの関数を記述し、 は、各サブリストの最大値を検出し、合計にそれらの最大値の二乗を返します。

私はwin hugsコンパイラで個々のコード行を使用してそれを行う方法を理解しましたが、実際にパラメータを持つ単純な関数にしたいと考えています。だから、

sumSquaresMax :: [[Int]] -> Int 
sumSquaresMax x 
    let maxes = map maximum x 
    let squares = map (^2) maxes 
    let finalSum = sum squares 

私が最初sumSquaresMax [[4,2,5],[6,2],[2],[-6,4,1]]を実行した場合、それはリストの最大値をマッピングします::[5,6,2,4]は、その後、それはこれらの数字のそれぞれを二乗し、その後につながる正方形を合計う、次のように私はこれまで持っていることです私の答え。

「印刷」についてはどうすればいいですかfinalSum?これが正しいとは限りませんが、ここからどこに行くのかは完全にはわかりません。どんな助けでも大歓迎です!

+0

"win hugsコンパイラで個々のコード行を使って行う方法を理解しました" - Hugsは何年も維持されていないので、GHC/GHCiに切り替えることをお勧めします。 – bheklilr

+3

@bheklilr私たちは彼がおそらくここに選択肢がないことを知っています;) – Carsten

+0

関連:http://stackoverflow.com/questions/27407773/sum-of-squares-using-haskell – Jubobs

答えて

2

例を理解していれば、例の関数にはlet文を1つだけ記述してください。 (複数のletステートメントを使用することもできますが、これはどのように行うかは異なります)。 letは、関数内で関数を定義する機能を提供します。これは、他の場所では使用しない単なるコードです。

letを使用する場合、関数の実際の戻り値を提供するには、inも含める必要があります。

また、機能本体を定義する記号=もありません。ここで

は、私はあなたがやろうとしていると思うものです:

sumSquaresMax :: [[Int]] -> Int 
sumSquaresMax x = 
    let maxes = map maximum x 
     squares = map (^2) maxes 
    in sum squares 
+0

もちろん、複数の 'let ' - たとえば、' fx = let y = x + 5、let z = y + 6 in z'は完璧に良い表現です - 実際にあなたはこれよりも短い構文的砂糖です – Carsten

+0

確かに、私は簡潔にしようとしていました。私はもう少し明確にするためにそれを更新しました。 –

2

あなたが実際にそこにそれを持っている - あなたがしなければならないすべては、名前を置き換えている:

sumSquaresMax x 
= sum squares 
= sum (map (^2) maxes) 
= sum (map (^2) (map maximum x)) 
= sum . map (^2) . map maximum $ x 
= sum . map ((^2) . maximum) $ x 

ので、全体的な:

sumSquaresMax = sum . map ((^2) . maximum) 

例:

Prelude> let sumSquaresMax = sum . map ((^2) . maximum) 
Prelude> sumSquaresMax [[4,2,5],[6,2],[2],[-6,4,1]] 
81 
関連する問題