w komentarzach pytanie Tacit function composition in Haskell, osoby wymienionej dokonywania wystąpienie Num
dla a -> r
, więc pomyślałem, że mogę grać z użyciem notacji funkcyjnego reprezentuje mnożenie:liczb jako funkcji multyplikatywnych (dziwne, ale zabawny)
{-# 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 *)
Należy pamiętać, że definicja fromInteger oznacza, że mogę napisać 3 4
, która ocenia do 12, a 7 (2+8)
ma 70, tak jak można by oczekiwać.
To wszystko idzie cudownie, zabawnie dziwnie! Proszę wyjaśnić ten wierdness jeśli można:
*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. Stosowane zamiast aplikacyjnych Monady ponieważ aplikacyjnych jest ogólnie super, ale to nie robi dużej różnicy w ogóle do kodu]
W GHC 7.4 możliwe jest usunięcie manekinów 'Show' i' Eq', ponieważ 'Num' już ich nie wymaga. – sdcvvc
'Monada' to przesada tutaj. Prostszy i bardziej ogólny "Applicative" wystarcza. – Conal
@sdcvvc Niedługo uaktualnię, tak. – AndrewC