2011-08-14 13 views
11

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 

Odpowiedz

11

Tak, można zastosować funkcje do krotek, używając pakietu tuple. Sprawdź, w szczególności uncurryN funkcję:

Prelude Data.Tuple.Curry> (+) `uncurryN` (1, 2) 
3 
+0

Zgaduję, że używa szablonu Haskell? – Chuck

+0

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

+0

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

3

Funkcja uncurry zamienia funkcję na dwa argumenty na funkcję na krotce. Listy nie działałyby na ogół ze względu na ich wymóg jednorodności.

+0

żeby była jasność: mówisz, że nie można zrobić na krotki arbitralne długości, ale uncurry prace o szczególnym przypadku pary? – gfxmonk

+0

@gfxmonk: Tak. Każda kombinacja liczby i kombinacji typów w krotce jest odrębnym typem w systemie typu Haskella, więc funkcja nie może przyjmować każdego typu krotki. – Chuck

3

Nie, system typu Haskella nie lubi tego. Sprawdzić to podobne pytanie po więcej szczegółów:

How do I define Lisp’s apply in Haskell?

BTW, operator ikona mówisz o jest również znany jako funkcji apply, powszechnie spotykane na dynamicznych języków funkcyjnych (takich jak LISP i JavaScript).

+1

Uważam, że jest to poprawne dla list, ale zapytałem konkretnie o krotki w pytaniu. – gfxmonk

+0

@gfxmonk: Nadal, wyliczenia w Pythonie są podobne do list, IMO, ponieważ mogą mieć dowolną długość, a ikona działa tak samo. W Haskell nie możesz mieć funkcji działającej na krotkih zbirów, chyba że użyjesz głębokiej magii. – hugomg

Powiązane problemy