基于位置的元组模式匹配在Haskell中

Woj*_*ilo 4 haskell tuples pattern-matching

是否可以在Haskell中模式匹配元组,但不知道元组的维数?我想创建一个与任何元组相对应的函数,第一个元素是A:

data A = A Int
test args@(A a,..) = a
Run Code Online (Sandbox Code Playgroud)

我知道有Data.Tuple.Select模块,我可以像这样使用它:

test args = case sel1 args of
    A a -> a
    ...
Run Code Online (Sandbox Code Playgroud)

但这是否是这样做的唯一方法,或者Haskell有一些默认机制来匹配任何维度元组?

Wil*_*rin 7

您可以使用ViewPatterns扩展来模式匹配应用于参数的函数的结果:

{-# LANGUAGE ViewPatterns #-}

data A = A Int
test (fst -> A a) = a
Run Code Online (Sandbox Code Playgroud)

您可以使用镜头投射任意字段:

{-# LANGUAGE ViewPatterns #-}

import Control.Lens
import Control.Arrow ((&&&))

data A = A Int
test (fields _1 _3 -> (A x, A y)) = x + y

fields f1 f2 = (^.f1) &&& (^.f2)

-- > test (A 1, A 2, A 3)
-- > 4
Run Code Online (Sandbox Code Playgroud)