En los comentarios de la cuestión Tacit function composition in Haskell, personas mencionaron haciendo una instancia Num
para a -> r
, así que pensé que volvería a jugar con el uso de la notación de funciones para representar la multiplicación:numeración funciones multiplicativas (extraño pero entretenido)
{-# LANGUAGE TypeFamilies #-}
import Control.Applicative
instance Show (a->r) where -- not needed in recent GHC versions
show f = " a function "
instance Eq (a->r) where -- not needed in recent GHC versions
f == g = error "sorry, Haskell, I lied, I can't really compare functions for equality"
instance (Num r,a~r) => Num (a -> r) where
(+) = liftA2 (+)
(-) = liftA2 (-)
(*) = liftA2 (*)
abs = liftA abs
negate = liftA negate
signum = liftA signum
fromInteger a = (fromInteger a *)
Tenga en cuenta que la definición fromInteger significa que puedo escribir 3 4
, que evalúa a 12, y 7 (2+8)
es 70, exactamente como era de esperar.
¡Entonces todo va maravillosamente, entretenidamente raro! Por favor explicar esto wierdness si puedes:
*Main> 1 2 3
18
*Main> 1 2 4
32
*Main> 1 2 5
50
*Main> 2 2 3
36
*Main> 2 2 4
64
*Main> 2 2 5
100
*Main> (2 3) (5 2)
600
[Editar:. Aplicativo utilizado en lugar de mónada porque Aplicativo es grande por lo general, pero no hay mucha diferencia en absoluto al código]
En GHC 7.4, es posible eliminar las instancias ficticias 'Show' y' Eq', ya que 'Num' ya no las necesita. – sdcvvc
'Monad' es exagerado aquí. El 'Aplicativo' más simple y más general es suficiente. – Conal
@sdcvvc Voy a estar actualizando pronto, sí. – AndrewC