Haskell在3部分元组上执行fst

10 haskell

我有以下Haskell元组:

       [("string",1,1)]
Run Code Online (Sandbox Code Playgroud)

我需要提取这个的第一个元素,显然使用'fst'不会在这里工作,因为有3个组件.

什么是最好的使用方法?塞尔

Mar*_*sos 15

你可以输入你自己的函数(我们将使用模式匹配):

fst3 :: (a, b, c) -> a
fst3 (x, _, _) = x
Run Code Online (Sandbox Code Playgroud)

你使用它像:

fst3 ("string", 1, 1)
Run Code Online (Sandbox Code Playgroud)

  • @user2214957 如果您不知道(我看到您是新用户):当您决定最喜欢哪个答案时,您应该将其作为最佳/正确答案接受。 (2认同)

zur*_*rgl 5

sel 可以按以下方式使用:

$ cabal install tuple
$ ghci
>>> :m +Data.Tuple.Select
>>> sel1 ("string",1,1)
"string"
Run Code Online (Sandbox Code Playgroud)

它的工作方式与其他任何功能一样 map

>>> map sel1 [("One",1,0),("Two",2,0),("Three",3,0)]
["One","Two","Three"]
Run Code Online (Sandbox Code Playgroud)

主要优点是它适用于更大的元组

>>> sel1 ("string",1,1,1)
"string"
Run Code Online (Sandbox Code Playgroud)

以及标准元组

>>> sel1 ("string",1)
"string"
Run Code Online (Sandbox Code Playgroud)

因此不需要单独处理它们.


更多例子:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • 此限制是由于更多信息的ghc tupe限制,请参阅http://stackoverflow.com/questions/2978389/haskell-tuple-size-limit (2认同)

Dav*_*rak 5

您还可以使用镜头

> 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
Run Code Online (Sandbox Code Playgroud)

这不仅仅适用于第一个元素

> 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
Run Code Online (Sandbox Code Playgroud)

我还写了一个类似问题的答案,该问题不仅仅涵盖元组: /sf/answers/1670252111/