web-dev-qa-db-ja.com

Haskellの10タプルからn番目の要素を取得する方法は?

Haskell Tupleのn番目の要素を取得する必要があります。タプルは次のようになります:(3,5、 "String1"、 "String2"、 "String3"、 "String4"、 "String5"、 "String6"、 "String7"、 "String8"、 "String9"、 "String10 ")。この問題を解決するためのアイデアを教えてください。ありがとう。

23
jason

知っているかもしれないし、知らないかもしれないので、fstとsndは2要素のタプルに対してのみ機能します。

fst' (a,b) = a

私が知っている限り、あなたはあなた自身を書かなければなりません

get5th (_,_,_,_,a,_,_,_,_,_) = a

ご覧のとおり、独自のタイプを定義することができます。

31
DiegoNolan

パターンマッチングでそれを行うことができます。 2値または3値のタプルと照合できるように、10値のタプルと照合できます。

let (_, _, _, _, _, _, _, _, _, x, _, _) = Tuple in x

ただし、そうすることはできませんwant。タプルからn番目の値を取得しようとしている場合、ほぼ間違いなく間違った型を使用しています。 Haskellでは、長さの異なるタプルは異なりますtypes-これらは基本的に互換性がありません。 IntStringが異なるように、(Int, Int)(Int, Int, Int)も完全に異なります。

N番目の要素を取得できるデータ型が必要な場合は、[String]などのリストが必要です。リストを使用すると、インデックス作成に!!演算子(0から始まる)を使用できるため、次のようにできます。

myList !! 9

10番目の要素を取得します。

あなたの例を考えると、巨大なタプルではなく、(Int, Int, [String])のような型が必要だと思います。これにより、2つの数字と任意の数の文字列を使用できます。上記の!!演算子を使用してインデックスで文字列を取得できます。

41
Tikhon Jelvis

Tupleパッケージの選択関数 を使用することもできます。

22
Daniel Wagner

Tupleごとにこれを1回だけ行う必要があり、すべての要素を一度に必要とする場合は、単に使用できます

let (x, y, s1, s2, s3, s4, s5, s6, s7, s8) = someTuple
in ...

値を直接使用します。

3
Zoey Hewll