В http://www.haskell.org/pipermail/haskell-cafe/2007-August/030096.html метод typeclass collide
определяется как взятие 2-кортежа как его единственный аргумент, а не два «нормальных» аргумента (я думаю, что я понимаю частичное приложение и т. Д.).Когда функции Haskell принимают кортежи, а не несколько аргументов?
{-# 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"
Какова цель этого?
Когда лучше использовать аргумент кортежа, а не несколько аргументов?
Вы можете посмотреть на это: http://programmers.stackexchange.com/questions/185585/what-is-the-advantage-of-currying – Sibi
@Sibi вы рекомендуете всегда использовать кортежи, если вам не нужна автоматическая система Haskell curreying/uncurrying? – fadedbee
My _opinion_ - это то, что кортежи должны использоваться, когда два значения связаны по своей сути, например кортеж, представляющий координаты '(x, y)'. К счастью для 2-х кортежей, у нас есть 'curry' и' uncurry' для преобразования между этими представлениями, когда каждый из них более удобен, чем другой. – bheklilr