[Haskell-ELTE] Funkcionalis fuggosegek
Dr. ERDI Gergo
gergo at erdi.hu
2010. Május. 14., P, 11:54:51 CEST
Szia!
Eloszor is koszi a valaszt.
Masreszt viszont azert nem akarok tipusfuggvenyeket hasznalni, mert a GHCi
nem normalizalva irja ki a tipusokat, es ezert a valodi eredmenyt igazabol
nem kapom meg...
Pl. vegyuk a kovetkezo egyszeru peldat:
> {-# LANGUAGE EmptyDataDecls, TypeFamilies #-}
>
> data Zero
> data Succ n
>
> n0 = undefined :: Zero
> n1 = undefined :: (Succ Zero)
> n2 = undefined :: (Succ (Succ Zero))
> n3 = undefined :: (Succ (Succ (Succ Zero)))
>
> type family Add n m
> type instance Add n Zero = n
> type instance Add n (Succ m) = Succ (Add n m)
>
> _add :: n -> m -> Add n m
> _add = undefined
Marmost ha a GHCi-vel kiiratom az _add n2 n3 tipusat, akkor a kovetkezot
kapom:
_add n2 n3 :: Add (Succ (Succ Zero)) (Succ (Succ (Succ Zero)))
Ami a kerdes totalis megkerulese:), hiszen pontosan tudom, hogy ketto meg
harom osszege az ketto meg harom osszege...
Az altalanos modszert (hogy t.i. egy kulon tanuval kiegeszitem a
tipusosztalyok parametereit) nem sikerult atvennem, viszont ezzel az X
seged"fuggvennyel" mar megoldottam:
> class Eq x y b | x y -> b where
> _eq :: x -> y -> b
> instance Eq Zero Zero True
> instance (Eq x y b) => Eq (Succ x) (Succ y) b
> instance Eq Zero (Succ y) False
> instance Eq (Succ x) Zero False
>
> class X x a b d | x b a -> d
> instance X Zero b Zero b
> instance X Zero Zero (Succ a) Zero
> instance (X a b (Succ a) d) => X Zero (Succ b) (Succ a) d
> instance (X x a Zero d) => X (Succ x) Zero (Succ a) d
> instance (X x b a d) => X (Succ x) (Succ b) a d
>
> class Mod p q r | p q -> r where
> _mod :: p -> q -> r
> instance (X Zero p q r) => Mod p q r
>
> class Divides q p b | q p -> b where
> _divides :: q -> p -> b
> instance (Mod p q r, Eq r Zero b) => Divides q p b
Ugyhogy koszi, megprobalok tovabb haladni :)
--
.--= ULLA! =-----------------. `We are not here to give users what
\ http://gergo.erdi.hu \ they want' -- RMS, at GUADEC 2001
`---= gergo at erdi.hu =-------'
Az "ígéret" szép szó, de a "dnyepropetrovszk" még szebb.
More information about the Haskell
mailing list