2013-03-04 117 views
5

Haskell中是否有一個函數或函數需要n個參數,並返回一個n元組?例如:Haskell:'makeNtuple'函數?

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

ie:喜歡逗號,但對於兩個以上的參數。很顯然,make3tuple完成了這項工作,但我覺得必須有一種內置的方式來做到這一點,但我沒有找到它,或者錯過了某種使用其他無處不在功能的方式。

FWIW,在使用liftM3(或更高)時出現。例如:

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

謝謝!

回答

12

是的。

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

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

哈斯克爾編譯器到一定規模(我覺得保障是15元組)

+4

一個名爲'TupleSections'擴展,您甚至可以部分地應用它。所以'(,1,2)'等於'\ x y - >(x,1,y,2)'。 – 2013-03-04 01:20:59

+0

@amindfv哈哈哈哈哈...我明顯沒有想到逗號可以這樣使用。謝謝! – gwideman 2013-03-04 02:12:22

+1

@gwideman:請注意,這些是他們自己的操作符:'(,,)'與'(,)(,)'完全不同。如果你試圖編寫它們,你會得到如下形式:'(,)((,)3 4)5',它是'((3,4),5)' – amindfv 2013-03-04 02:15:18

1

不作爲提供這樣的功能了像makeNtuple :: Int -> a -> a -> ... -> (a,a,...)這樣的函數,注意它似乎甚至在類型語言中是不可表達的。如果您能夠接受具有均勻型的元組,那麼你可以使用"dependently-typed" Vectors

data Nat = Ze | Su Nat 

data Vec :: * -> Nat -> * where 
    Nil :: Vec a Ze 
    Cons :: a -> Vec a n -> Vec a (Su n) 
+0

夠公平了......實際上我並沒有期待一個帶有可變長度參數列表的普通makeNuple。這可以通過列表和zip來完成。 – gwideman 2013-03-04 02:11:10

+1

順便說一句,有一個發展良好的圖書館:[固定向量](http://hackage.haskell.org/package/fixed-vector) – leventov 2013-03-04 11:18:32