Można go uogólnić:
f ib :: (Monoid a, Num n)^-a->-a->-n-»a fib _ fO 0 = fO fib f 1 _ 1 = f 1
fib f 1 fO n = fib (f 1 ‘plus1 fO) f 1 (n-1)
Integer może być instancją monoidu:
instance Monoid Integer where plus = (+) zero = 0
ale możemy bardziej uogólnić:
instance Num n => Monoid n where — <---- tu nawet może być rekursja
plus = (+) zero = 0
dygresja o klasie Show:
instance Show a => Show (a, a) where
show (x, y) = "(" ++ show x ++ ", " ++ show y ++ ")"
String jest aliasem type String = [Char] i trzeba ustawić flagę-XTypeSynonymInstances
instance Monoid String where plus = (++) zero = ""
albo tak:
instance Monoid [a] where plus = (++) zero = []
to sobie możemy napisać tak: h = fib "a" "b" 3 ...
napiszmy szybki „power”:
power :: (Monoid t, Integral n) =► t -*• n -*■ t power x 0 = zero power x n
| n ‘mód1 2 == 0 = y ‘plus1 y | otherwise = y ‘plus1 y ‘plus1 x where y = power x (n ‘div‘ 2)
type Matrix2x2 a = ((a, a), (a, a))
instance Num a => Monoid (Matrix2x2 a) where
((all, al2), (a21, a22)) ‘plus1 ((bil, bl2), (b21, b22))
= ((allxbll + al2xb2l) ...
zero = ((1,0), (0,1))
4