В http://www.haskell.org/pipermail/haskell-cafe/2007-August/030096.html метод класса типов collide
определяется как принимающий 2-кортеж в качестве единственного аргумента, а не два «обычных» аргумента (я думаю, что понимаю частичное применение и т. д.).
{-# OPTIONS_GHC -fglasgow-exts
-fallow-undecidable-instances
-fallow-overlapping-instances #-}
module Collide where
class Collide a b where
collide :: (a,b) -> String
data Solid = Solid
data Asteroid = Asteroid
data Planet = Planet
data Jupiter = Jupiter
data Earth = Earth
instance Collide Asteroid Planet where
collide (Asteroid, Planet) = "an asteroid hit a planet"
instance Collide Asteroid Earth where
collide (Asteroid, Earth) = "the end of the dinos"
-- Needs overlapping and undecidable instances
instance Collide a b => Collide b a where
collide (a,b) = collide (b, a)
-- ghci output
*Collide> collide (Asteroid, Earth)
"the end of the dinos"
*Collide> collide (Earth, Asteroid)
"the end of the dinos"
Какова цель этого?
Когда лучше использовать аргумент кортежа, а не несколько аргументов?
(x, y)
. К счастью для двойных кортежей, у нас естьcurry
иuncurry
для преобразования между этими представлениями, когда одно удобнее другого. - person bheklilr   schedule 09.07.2014type FName = String; type LName = String; type Age = Int; type Person = (FName, LName, Age); greet :: Person -> IO (); greet (fname, lname, age) = putStrLn $ if age >= 30 then "Hello, " ++ fname ++ " " ++ lname else "Sup?"
- person bheklilr   schedule 09.07.2014collide
, поскольку вполне вероятно, что у вас может быть несколько столкновений с одним и тем же объектом, например.data Meteor = Meteor; instance Collide Planet Meteor where ...
иmeteorStorm :: [Meteor] -> [String]; meteorStorm = map (flip collide Planet)
, тогда как, если вы используете кортежи, вам придется писатьmeteorStorm = map (\m -> collide (m, Planet)
. Хотя количество символов примерно такое же, я лично считаю, что первое более читабельно. - person bheklilr   schedule 09.07.2014