Liczby jako funkcje multiplikatywne (dziwne, ale zabawne)

W komentarzach do pytaniaKompozycja funkcji ukrytych w Haskell, ludzie wspomnieli o zrobieniuNum przykłada -> r, więc pomyślałem, że będę grać z użyciem notacji funkcji do reprezentowania mnożenia:

{-# 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 *)

Zauważ, że definicja fromInteger oznacza, że ​​mogę pisać3 4 który ma wartość 12 i7 (2+8) ma 70 lat, tak jak miałeś nadzieję.

Wtedy wszystko idzie cudownie, zabawnie i dziwnie! Proszę wyjaśnić tę dziwność, jeśli możesz:

*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

[Edycja: użył Wniosku zamiast Monada, ponieważ ogólnie rzecz biorąc jest świetny, ale nie ma większego znaczenia dla kodu.]

questionAnswers(1)

yourAnswerToTheQuestion