次の Haskell タプルがあります。
[("string",1,1)]
これの最初の要素を抽出する必要があります.3つのコンポーネントがあるため、ここでは明らかに「fst」を使用しても機能しません。
使用する最良の方法は何ですか? セル?
これには、独自の関数を入力するだけです (パターン マッチングを使用します)。
fst3 :: (a, b, c) -> a
fst3 (x, _, _) = x
そして、あなたはそれを次のように使用します:
fst3 ("string", 1, 1)
sel
次の方法で使用できます。
$ cabal install tuple
$ ghci
>>> :m +Data.Tuple.Select
>>> sel1 ("string",1,1)
"string"
他の機能と同じように機能しますmap
>>> map sel1 [("One",1,0),("Two",2,0),("Three",3,0)]
["One","Two","Three"]
主な利点は、より大きなタプルで機能することです
>>> sel1 ("string",1,1,1)
"string"
標準のタプルと同様に
>>> sel1 ("string",1)
"string"
したがって、それらを個別に処理する必要はありません。
いくつかの例:
>>> map sel2 [("One",1,0),("Two",2,0),("Three",3,0)]
[1,2,3]
(0.06 secs, 4332272 bytes)
>>> map sel3 [("One",1,0),("Two",2,0),("Three",3,0)]
[0,0,0]
(0.01 secs, 2140016 bytes)
>>> map sel4 [("One",1,0),("Two",2,0),("Three",3,0)]
<interactive>:6:5:
.... error
lensパッケージを使用することもでき ます。
> import Control.Lens
> Prelude Control.Lens> view _1 (1,2) -- Or (1,2) ^. _1
1
> Prelude Control.Lens> view _1 (1,2,3) -- Or (1,2,3) ^. _1
1
> Prelude Control.Lens> view _1 (1,2,3,4) -- Or (1,2,3,4) ^. _1
1
> Prelude Control.Lens> view _1 (1,2,3,4,5) -- Or (1,2,3,4,5) ^. _1
1
これは、最初の要素以外にも機能します
> import Control.Lens
> Prelude Control.Lens> view _2 (1,2) -- Or (1,2) ^. _2
2
> Prelude Control.Lens> view _3 (1,2,3) -- Or (1,2,3) ^. _3
3
> Prelude Control.Lens> view _4 (1,2,3,4) -- Or (1,2,3,4) ^. _4
4
> Prelude Control.Lens> view _5 (1,2,3,4,5) -- Or (1,2,3,4,5) ^. _5
5
また、タプル以上のものをカバーする同様の質問への回答も書きました: https://stackoverflow.com/a/23860744/128583
関数を定義するだけです
fst3 :: (a,b,c) -> a
fst3 (x,_,_) = x
それは理解しやすく、奇妙な型を持っていません (の型はsel1
混乱Sel1 a b => a -> b
するかもしれません)
または、 のようにパターンマッチングを介して、関心のある値を抽出することもできます[x | (x,_,_) <- myThreeTupleList
。
最後に、最善の解決策は、より構造化されたデータ型を使用することです! 確かに、文字列と 2 つの int にはより多くの意味があり、それを何らかの方法でエンコードすることをお勧めします...
あなたはこれを行うことができます:
Prelude> let [(a,_,_)]=[("string",1,1)]
Prelude> a
"string"