2017-03-26 7 views
1

Haskellで関数を定義して、doubleのリストを取得する方法と、mapを使用して各リストの最高値を返す方法はありますか?リストのリストの最大値を計算する

このように:func4 [[2,4],[4,7],[7,9]] = [4,7,9]

私はいろいろ試してみましたが、間違っています。この操作は可能ですか?

func4 [[x,y]] = map maximum [x,y] 

func4 [[x,y]] = [xs| xs <- map maximum [x,y]] 
+0

func4 [[2,4]、[4,7]、[7,9]] - > [4,7,9] –

答えて

3

func4が期待するので、それが動作しない理由がある - あなた自身を言うように - リストのリストを。だから[[x,y]]はリストのリストです。今度は[x,y]の商品リストであることを意味します。 xyは、maximumから(そしてそれが正しく働いていても)計算できるリスト自体であることを確かめることはできません。

あなたは、単にのように、(リストのリスト)を[[x,y]]パターンを省略しlを使用することができます。それならば

-- with eta-reduction 

func4 :: Ord b => [[b]] -> [b] 
func4 = map maximum -- look mom... no variables

ETA-削減を使用し、

func4 :: Ord b => [[b]] -> [b] 
func4 l = map maximum l

またはより良いですすべてのリストにちょうど2つの要素が含まれているの要件です。

ここ
func4 :: Ord b => [[b]] -> [b] 
func4 = map (\[x,y] -> max x y)

あなたはmax x ymapその後yあなたはアイテムでパターンマッチングを行い、そして、それは2つの要素を持つリストでなければなりませんxと。この関数は、を含まないリストを正確に2つの要素にマップする必要がある場合、エラーになります。 \[x,y] -> max x yは、ラムダ式と呼ばれます。

+0

本当に 'Foldable t'型定義か' [b]] '' [[b]] - > [b] 'のように十分でしょうか? – Redu

+0

@Redu:最も一般的な型シグネチャは 'Foldable t'ですが、' Foldable'はリストよりも理解しにくいので、ここで '[[b]]'を使う方が良いでしょう。 –

+0

@Redu:答えを編集しましたか? –

関連する問題