cwbe coordinatez:
101
63540
2076399
3671716
4290616
4290661

ABSOLUT
KYBERIA
permissions
you: r,
system: public
net: yes

neurons

stats|by_visit|by_K
source
tiamat
K|my_K|given_K
last
commanders
polls

total descendants::
total children::1
show[ 2 | 3] flat


Kratsia odpoved:

pretoze (.) komponuje dve fcie takto:

f :: a -> b
g :: b -> c

g . f :: a -> c

V priklade hore mame (odpustim si polymorfizmus):

(*) :: Int -> (Int -> Int)
(*2) :: Int -> Int

Vsimni si, ze sa neda zvolit premenna b:
* v pripade (*): b = Int -> Int
* v pripade (*2): b = Int

Co vedie k tomu, ze tento kus kodu sa proste neotypuje.

Dlhsia odpoved:
V skutocnosti su typy nasledovne:

(*) :: Num x => x -> (x -> x)
(*2) :: Num x => x -> x

Takze Haskellovsky type system to naunifikuje (ano, Haskellovsky type system je v podstate nebacktrackujuci Prolog) nasledovne:

a = Num x => x
b = Num (x -> x), Num x => x -> x
c = Num (x -> x), Num x => x -> x

cim v podstate vyrobi z (*2) funkciu typu Num (x->x), Num x => (x -> x) -> (x -> x).
To sa ale neotypuje, pretoze x -> x nie je instanciou triedy Num. A to je prave chyba, ktoru GHC vypise.

Vyskytuje sa tu teda (na prvy pohlad) zaujimavy jav akehosi rozsirenia typu tak, ze za typovu premennu nedosadis primitivum. Uvazme napriklad vyraz:

flip id

kde

flip f x y = f y x
id x = x

Nezmysel? Ale kdeze. Je to validny kod. Staci sa zamysliet, preco. :)




00000101000635400207639903671716042906160429066104292840
hexo
 hexo      15.11.2008 - 01:24:55 , level: 1, UP   NEW
Dakujem Ti. Medzitym som to pochopil aj sam ked som sa lepsie pozrel na typy, hlavne na typ (.). Skoda len ze som si to neuvedomil na pisomke...