web-dev-qa-db-ja.com

タプルの特定の要素にアクセスする

Haskell-newbieのレポート。質問は次のとおりです。Haskellには、2タプルの最初と2番目の要素を返すfstsndがあります。タプルからi番目の要素にアクセスする簡単な方法がないのはなぜですか?今、私は3タプルを持っています。1番目の要素を読みたいです。このタスクを達成する唯一の方法は、パターンマッチングのトリックを行うことです。なぜこれが簡単にできないのですか?それとも簡単な方法がありますか?

34
user500944

言語があなたが望む特別な構造を持つことを妨げるものは、その設計です。デザイナーはこれを入れませんでした。言語の定義が複雑になるためです。 fstおよびsndは、ペアの一般的なケースのライブラリ関数です。他のすべてを自分で定義することもできますし、データメンバが適切な名前を持つようにデータのレコードタイプを定義することもできます。

(GHCにはこれを行う拡張機能があるかもしれませんが、私はこれに遭遇していません。ドキュメントを確認するか、メーリングリストで確認してください。)

29
Fred Foo

ハッキングに関する Tupleライブラリ を確認してください。タプルのさまざまな操作(定義済みサイズまで)の関数がオーバーロードされています。

21
augustss

[〜#〜] n [〜#〜]-タプルは、Intキーを介したインデックス付けのためのデータ構造ではなく、代わりに、 arraysfinger-trees。 など、1つのインデックス付きデータ構造を見る必要があります。

今、 index操作を提供するTuple型のファミリーの型クラス を想像することができますが、そのための配列がすでにあり、タプルを作成するために必要なボイラープレートがたくさんありますあらゆるタイプのこの操作をシームレスに提供します。得られた力は努力する価値はありません。

13
Don Stewart

なぜこれが簡単にできないのですか?それとも簡単な方法がありますか?

最近の代替 ​​lens パッケージを使用すると、より簡単になります。 Tupleモジュール には最大9個の要素タプルのセレクターがあり、必要に応じてさらに定義するのは簡単です。

> import Control.Lens
> data A = A deriving (Show)
> (1, '2', "3", A) ^. _1
1
> (1, '2', "3", A) ^. _2
'2'
> (1, '2', "3", A) ^. _3
"3"
> (1, '2', "3", A) ^. _4
A

lens パッケージを使用して、要素を多態的に更新し、更新時に型を変更することもできます。

中置演算子の有無にかかわらず:

> (1, '2', "3", A) & _1 .~ "wow"
("wow",'2',"3",A)
 > set _1 "wow" (1, '2', "3", A)
("wow",'2',"3",A)

github readme は、多数の例と同様に、基礎となる理論についての詳細を調べるための開始点として適しています。


タプルだけでなく

同様の構文はTraverablesFoldablesでも機能します。したがって、Trees、Maps、Vectorsなどです。たとえば、タプルのリストがある場合、1インデックスで3番目のTuple要素にアクセスするには、 element 1で最初のインデックス要素にアクセスし、_3で3番目のTuple要素にアクセスします。

[(1,2,3),(4,5,6),(7,8,9)] ^? element 1 . _3
Just 6
8
Davorak

テンプレートhaskellを使用してこれを行うアプローチの問題は、 以前にここで説明した でした。

その使用例:

> $(sel 2 3)( 'a'、 'b'、 'c')
 'b' 
> $(sel 3 4)( 'a'、 'b'、 'c'、 'd')
 'c' 

ここから

5
monk
cabal update
cabal install Tuple
ghci

λ> import Data.Tuple.Select
λ> sel3 (0, "1", 2) --select the third element
2
UnchartedWorks

Nikita Volkovの新しい "record"ライブラリ には、あなたがやりたいように見える機能があります。 「タプルもレコードです!」という見出しを検索しますリンクされたページ。

ライブラリはまだ開発中であるように見えるため、現在のインストールおよび使用は、将来のように簡単ではない可能性があります。

1
Vectornaut