2013-03-12 23 views
10

私はfstsndがある知っているが、なぜ型クラスを使用してこのようなアクセサ関数には、「一般的な」定義は存在しませんか?私は確かになぜHaskellのタプルに「一般的な」アクセサ関数がないのですか?

class Get1 p a | p -> a where 
    get1 :: p -> a 

instance Get1 (a,b) a where 
    get1 (x,_) = x 

instance Get1 (a,b,c) a where 
    get1 (x,_,_) = x 

class Get2 p a | p -> a where 
    get2 :: p -> a 

instance Get2 (a,b) b where 
    get2 (_,x) = x 

instance Get2 (a,b,c) b where 
    get2 (_,x,_) = x 

のようなものをお勧めします、あなたは、このためのいくつかの言語拡張を必要とするが、これはずっとそのような方が便利ではないでしょうか?特に、独自のタイプのインスタンスを追加できます。

+4

この及び他のタプルグッズは[タプル(http://hackage.haskell.org/package/tuple)パッケージで提供されています。 – is7s

+0

@ is7sありがとう、私はこれについて知らなかった – Landei

+9

答えはおそらく "誰もタプルをあまり使わない"ためです。とにかく、大きなものではありません。 – MathematicalOrchid

答えて

6

注意すべきことは、fstsndは、2タプルだけを見ることができます。それらを他の宗教や活動に一般化することは、すぐに苦しくなります。たとえば、タプルの最初の要素をマップしたい場合は、別のコンビネータを導入する必要があります(2タプルの場合はControl.Arrow.firstとして存在します)。これにより、高アーリータプルのコンビネータの数が急速に爆発的に増加します。 lensはタプルでの作業にいくつかの素晴らしいツールを提供し、言われていること

Control.Lens.Tupleたとえば9

をアリティまでタプルの第一、第二、等の要素へのアクセスを可能にするいくつかの指標レンズ_1_2、等、あなたがあってもよい

>>> import Control.Lens 
>>> let t = (1,2,3,5,6,7,2) 
>>> t ^._1 
1 
>>> t & _1 .~ 'a' 
('a',2,3,5,6,7,2) 
>>> t & _1 +~ 41 
(42,2,3,5,6,7,2) 
>>> over _1 (+1) t 
(2,2,3,5,6,7,2) 

を提供しますタプルのインスタンスに興味があるのはControl.Lens.Atです。また、tuple-lensespackageは、一度に複数のタプルエントリを調べるために、より一般的なレンズを提供します。

3

このようなタイプのクラスのみ(シンタックス)利便性をコーディング与える、私は彼らの上にタプル型ツール上で一般的なビルドする方法が表示されません。タプルの一般化を探しているなら、Redditでthe discussion about heterogeneous vectorsをチェックしてください。

また、通常の構造のために、高いアリティのタプルを使用し、その後、独自のADTを定義し、賢明な名前のゲッターを提供することが好ましいことが、注意してください。

編集:コメントで指摘is7sようしかし、任意の長さのタプルのためのインデックス機能を提供hackage上のパッケージの数があります。

+1

いいえ、私が参照したパッケージは 'TemplateHaskell'を使って実装されていません。 'Data.Tuple.Select'モジュールは、OPと同じように実装されています。 – is7s

関連する問題