5

Haskell 中是否有一个或多个函数接受 n 个参数并返回一个 n 元组?例如:

make3tuple:: a -> a -> a -> (a,a,a)
make3tuple a b c = (a,b,c)

即:像逗号,但不止两个参数。显然 make3tuple 可以完成这项工作,但我觉得必须有一个内置的方法来做到这一点,我还没有找到它,或者错过了使用其他一些无处不在的功能的方法。

FWIW,使用liftM3(或更高版本)时会出现这种情况。例如:

type RandomState a = State StdGen a
[...]
getTwoRandoms = liftM2 (,) getRandom getRandom
get3Randoms = liftM3 make3tuple getRandom getRandom getRandom

谢谢!

4

2 回答 2

13

是的。

(,,) :: a -> b -> c -> (a, b, c)
(,,,) :: a -> b -> c -> d -> (a, b, c, d)

等等

所以你可以写liftM3 (,,) getRandom getRandom getRandom

Haskell 编译器提供这样的函数,直到一定大小(我认为保证是 15 元组)

于 2013-03-04T01:16:53.967 回答
1

不像一个函数makeNtuple :: Int -> a -> a -> ... -> (a,a,...),请注意它似乎在类型语言中甚至是不可表达的。如果您对具有同质类型的元组感到满意,那么您可以使用"dependent-typed" Vectors

data Nat = Ze | Su Nat

data Vec :: * -> Nat -> * where
  Nil  :: Vec a Ze
  Cons :: a -> Vec a n -> Vec a (Su n)
于 2013-03-04T01:25:03.780 回答