12

次の Haskell タプルがあります。

       [("string",1,1)]

これの最初の要素を抽出する必要があります.3つのコンポーネントがあるため、ここでは明らかに「fst」を使用しても機能しません。

使用する最良の方法は何ですか? セル

4

5 に答える 5

17

これには、独自の関数を入力するだけです (パターン マッチングを使用します)。

fst3 :: (a, b, c) -> a
fst3 (x, _, _) = x

そして、あなたはそれを次のように使用します:

fst3 ("string", 1, 1)
于 2013-03-28T14:04:05.093 に答える
9

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
于 2013-03-28T14:20:19.743 に答える
5

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

于 2013-03-28T16:22:44.037 に答える
4

関数を定義するだけです

fst3 :: (a,b,c) -> a
fst3 (x,_,_) = x

それは理解しやすく、奇妙な型を持っていません (の型はsel1混乱Sel1 a b => a -> bするかもしれません)

または、 のようにパターンマッチングを介して、関心のある値を抽出することもできます[x | (x,_,_) <- myThreeTupleList

最後に、最善の解決策は、より構造化されたデータ型を使用することです! 確かに、文字列と 2 つの int にはよ​​り多くの意味があり、それを何らかの方法でエンコードすることをお勧めします...

于 2013-03-28T14:08:49.893 に答える
3

あなたはこれを行うことができます:

Prelude> let [(a,_,_)]=[("string",1,1)]
Prelude> a
"string"
于 2013-03-28T14:06:13.483 に答える