Nei commenti della questione Tacit function composition in Haskell, le persone menzionate fare un esempio Num
per a -> r
, così ho pensato di giocare con la notazione utilizzando la funzione di rappresentare la moltiplicazione:Numeri come funzioni moltiplicative (strano ma divertente)
{-# 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 *)
Si noti che la definizione fromInteger significa che è possibile scrivere 3 4
che restituisce 12, e 7 (2+8)
è 70, proprio come si spera.
Quindi tutto va meravigliosamente, divertente stranamente! Si prega di spiegare questo wierdness se potete:
*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
[Edit:. Utilizzato applicativo invece di Monade perché applicativo è grande generale, ma non fa molta differenza a tutti per il codice]
In GHC 7.4, è possibile rimuovere le istanze fittizie 'Show' e' Eq', poiché 'Num' non le richiede più. – sdcvvc
'Monad' è eccessivo qui. È sufficiente il 'Applicativo' più semplice e più generale. – Conal
@sdcvvc Farò presto l'aggiornamento, si. – AndrewC