5

Haskell に n 個の引数を取り、n 個のタプルを返す関数はありますか? 例えば:

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

つまり、コンマと似ていますが、3 つ以上の引数が必要です。明らかに 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,...)、型言語では表現できないようです。同種の型を持つタプルに問題がない場合は、「依存型」を使用できますVector

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 に答える