0

タプルのリストを作成しようとしています。入力はタプルのリストで[([char], int1, int2), ...]あり、出力は次のようなタプルのリストです[([char], int1, int2, (int1/int2)), ...]。タプルのリストのリストを作成していると思うので、以下のコードが間違っていることを知っています[[(),(),(),()], [(),(),(),()]]

コード:

{- take a list of labels, values, and weights and return list of labels and fractions -}
fraclist [] = []
fraclist x = [ (y,r,q,z) : y <- first (head x) | r <- scnd (head x) | q <- last (head x) | z <- r/q ] : fraclist tail x

{- helper func to get values from tuples -}
frst (a,b,c) = a
scnd (a,b,c) = b
last (a,b,c) = c

説明されている適切な出力フォームを取得するにはどうすればよいですか?また、zが降順になるように順序付けられたタプルのリストを出力するにはどうすればよいですか?

4

3 に答える 3

1

私はあなたがただ欲しいと思います

fraclist xs = [(y,r,q, r `quot` q) | (y,r,q) <- xs]

(注:コンポーネントに名前を付けたので、quot代わりに使用しました。)(/)int1int2

リスト内包表記を使用しないバリアントは

fraclist = map (\(y,r,q) -> (y,r,q, r `quot` q))

コードがコンパイルされない場合は、エラーメッセージを投稿して、考えられる原因が一目でわかるようにすることをお勧めします。

あなたは最初<-に解析エラーを取得します

fraclist x = [ (y,r,q,z) : y <- first (head x) | r <- scnd (head x) | q <- last (head x) | z <- r/q ] : fraclist tail x

(y,r,q,z) : y <- first (head x)生成された式をジェネレータ式から最初に分離する前の式|は整形式ではないためです。これは単なるタイプミスだと思います。あなたもそこ|の代わりに使用するつもりでし(:)た。

次に、リスト内包にいくつかの区切り文字がありますが、これは拡張子|なしでは無効です。ParallelListCompただし、3つの値はすべて同じリストから取得されるため、コードは実際には並列リスト内包表記のようには見えません。最後に、リスト内包表記で要素を引き出すことができるリストではないため、最後の部分| z <- r/qも整形式ではありません。r/qあなたはおそらくlet z = r/qそこで意図していました。

于 2012-07-30T18:30:14.193 に答える
1

このコードはコンパイルされません(構文エラー)が、それを修正した後(リスト内包表記('、' s vs.'|'s)の構文を読んで、他の変更を加えることをお勧めします:

  • リスト内包表記を使用しました。これは、ベースケースとリストのマッピングを処理するため、//ビジネスを排除することができfraclist [] = []ましheadた。tail:

  • パターンマッチングを使用して入力タプルから値を引き出します-これは、関数を使用して値を分解するよりもはるかに読みやすいことがよくあります

  • ドキュメント化のために明示的な型署名を追加しました

これがあなたが意味したと思うことです:

fraclist :: (Integral t1) => [(t, t1, t1)] -> [(t, t1, t1, t1)]
fraclist xs = [(x, y, z, div y z) | (x, y, z) <- xs]

並べ替えはあなたにお任せします。

于 2012-07-30T18:30:23.113 に答える
0

リスト内包表記のない簡単な解決策は次のとおりです。

import Data.List

-- (string, int1, int2) -> (string int1, int2, (int1/int2))
fraclist list = map generateTuple list
    where generateTuple (label, value, weight) = (label, value, weight, (value)/(weight)) 

sortFracListByValueWeightRatio list = sortBy sorter list
    where sorter (_,_,_,d) (_,_,_,h) = if d > h then GT else LT

testList = [("first",3.0,4.0), ("second",4.0,7.0)]

特別なことは何もありません(私は1週間だけhaskellを使用しました)。

fraclistは、generateTuple関数をリストにマッピングすることによって機能します。generateTuple関数は、フォームのタプル(タイトル、値、重み、値/重み)を返すだけです。Mapは、リストの各要素に特定の関数を適用するだけの組み込み関数です。

sortFracListByValueWeightRatio (長い名前で申し訳ありません)は、組み込みのsortBy関数(Data.Listから取得)を使用します。この関数は、アイテムを比較するためのカスタム関数を使用して特定のリストを並べ替えます。ソーターは私のアイテム比較ツールであり、値と重量の比率を比較するだけで、GTまたはLT(大なり記号/低値)のいずれかを返します。したがって、リストアイテムはカスタム比較ツールを使用して比較され、その回答に基づいて並べ替えられます。

読みやすさの大幅な改善は、タプルだけでなく、型を使用して値を記述することです。また、テストリストでdoubleを使用していますが、変更は簡単です。

于 2012-07-30T18:44:56.853 に答える