Haskell 哈斯克尔:';makeNtuple';功能?
Haskell中是否有一个或多个函数接受n个参数并返回n元组?例如:Haskell 哈斯克尔:';makeNtuple';功能?,haskell,tuples,Haskell,Tuples,Haskell中是否有一个或多个函数接受n个参数并返回n元组?例如: make3tuple:: a -> a -> a -> (a,a,a) make3tuple a b c = (a,b,c) type RandomState a = State StdGen a [...] getTwoRandoms = liftM2 (,) getRandom getRandom get3Randoms = liftM3 make3tuple getRandom getRandom g
make3tuple:: a -> a -> a -> (a,a,a)
make3tuple a b c = (a,b,c)
type RandomState a = State StdGen a
[...]
getTwoRandoms = liftM2 (,) getRandom getRandom
get3Randoms = liftM3 make3tuple getRandom getRandom getRandom
ie:像逗号,但有两个以上的参数。显然,make3tuple可以完成这项工作,但我觉得必须有一种内置的方法来完成这项工作,而我没有找到它,或者错过了使用其他无处不在的功能的方法
FWIW,使用liftM3(或更高版本)时会出现这种情况。例如:
make3tuple:: a -> a -> a -> (a,a,a)
make3tuple a b c = (a,b,c)
type RandomState a = State StdGen a
[...]
getTwoRandoms = liftM2 (,) getRandom getRandom
get3Randoms = liftM3 make3tuple getRandom getRandom getRandom
谢谢 是的
(,,) :: a -> b -> c -> (a, b, c)
(,,,) :: a -> b -> c -> d -> (a, b, c, d)
等等
所以你可以写liftM3(,)getRandom getRandom
Haskell编译器提供的函数最多可以达到一定的大小(我认为保证是15个元组)而不是像
makeNtuple::Int->a->a->……->>(a,a,…)
注意,它甚至在类型语言中似乎是不可表达的。如果您同意元组具有同质类型,那么可以使用
使用名为
TupleSections
的扩展,您甚至可以部分应用此功能。所以(,1,2)
等于\xy->(x,1,y,2)
@amindfv哈哈哈。。。我显然没有想到逗号可以这样使用。谢谢@格维德曼:请注意,这些是它们自己的操作符:(,)
与(,)(,)
完全不同。如果你试着编写它们,你会得到这样的结果:(,)(,)34)5
,这就是((3,4),5
@amindfv:有趣的是,这让我看到了Tuple.hs,它们是在哪里定义的。你猜对了,我认为这是一种神秘的逗号合成方法,而实际上这些函数是以普通方式定义的单个函数。Thanks@gwideman:我猜是因为我曾经做过同样的假设:)很公平。。。事实上,我并不期待一个具有可变长度arg list的通用makeNtuple。这可以通过列表和zip来实现。顺便说一句,有一个完善的黑客库: