W python/ruby (i innych, jestem pewien). możesz poprzedzić wyliczanie za pomocą * ("splat"), aby użyć go jako listy argumentów. np. w python:Czy haskell ma operatora splat jak python/ruby?
>>> def foo(a,b): return a + b
>>> foo(1,2)
3
>>> tup = (1,2)
>>> foo(*tup)
3
Czy jest coś podobnego w haskell? Zakładam, że nie będzie działać na listach z powodu ich nieznanej długości, ale uważam, że krotki powinny działać. Oto przykład tego, co chciałbym:
ghci> let f a b = a + b
ghci> :t f
f :: Num a => a -> a -> a
ghci> f 1 2
3
ghci> let tuple = (1,2)
szukam operatora (lub funkcja), która pozwala mi robić:
ghci> f <op> tuple
3
Widziałem < *> miano " splat ", ale zdaje się nie odnosić się do tego samego, co ikona w innych językach. Mimo to spróbowałem:
ghci> import Control.Applicative
ghci> f <*> tuple
<interactive>:1:7:
Couldn't match expected type `b0 -> b0'
with actual type `(Integer, Integer)'
In the second argument of `(<*>)', namely `tuple'
In the expression: f <*> tuple
In an equation for `it': it = f <*> tuple
Zgaduję, że używa szablonu Haskell? – Chuck
Dzięki, to działa przyjemnie. Niefortunne, że zdaje się arbitralnie być zdefiniowana tylko do krotek 15 elementów, ale to chyba dużo;) – gfxmonk
Tak, to musi być zdefiniowane dla poszczególnych typów krotek, ponieważ w Haskell każdy typ krotki jest z technicznego punktu widzenia innym typem. (Tak więc "(a, b)" lub "para" jest całkowicie niezwiązanym typem z "(a, b, c)" lub "potrójnym" - mają po prostu specjalną składnię, która pozwala na dowolne budowanie duże tego typu.) Nie sądzę, że powyższy pakiet używa szablonu Haskell, chociaż nie rozpoznaję "|" symbol używany w definicji klasy. – mgiuca