[Haskell] type mismatch

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Stel we hebben een standaard boter-kaas en eieren situatie.

Haskell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
data Field = X | O | B
    deriving (Eq, Ord)

type Row   = (Field, Field, Field)
type Board = (Row, Row, Row)

{- Begin of tuple helper functions -}
fst3 :: (a,b,c) -> a
fst3 (a,_,_) = a
scn3 :: (a,b,c) -> b
scn3 (_,b,_) = b
thrd3 :: (a,b,c) -> c
thrd3 (_,_,c) = c 
{- End of tuple helper functions -}


Wat ik hoop te bereiken is een lijstje te genereren met tuples van (func, func) die mij vervolgens weer, gegeven een board, een field kunnen aanreiken. Maar dat lijstje is enkel voor blank fields. Dus daar gaan we:

Haskell:
1
2
3
findblanks :: Board -> [(a, b)]
findblanks board = filter (\(row,col) -> col (row board) == B) list
    where list = [(fst3, fst3), (fst3, scn3), (fst3, thrd3), (scn3, fst3), (scn3, scn3), (scn3, thrd3), (thrd3, fst3), (thrd3, scn3), (thrd3, thrd3)]


(Disclaimer: ja, de lijst met combinaties is nou niet bepaald uitbreid-vriendelijk, maar it'll have to do.... )

Echter krijg ik zoals enkelen van jullie met ervaring in leren van functioneel, wat problemen met types matchen. Op één of andere manier "zie" ik het gewoon even niet..... |:(
Couldn't match expected type `b' with actual type `Row -> Field'
`b' is a rigid type variable bound by
the type signature for findblanks :: Board -> [(a, b)]
at Main.hs:143:15
The function `col' is applied to one argument,
but its type `b' has none
In the first argument of `(==)', namely `col (row board)'
In the expression: col (row board) == B
edit: Wat ik met dat tussenstukje bedoel is dat ik later weer dit ongeveer heb:
Haskell:
1
boardtoField :: Board -> (functie, functie) -> Field

[ Voor 4% gewijzigd door afraca op 06-10-2013 17:49 ]

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 10:53

RayNbow

Kirika <3

afraca schreef op zondag 06 oktober 2013 @ 17:48:
[...]

Wat ik hoop te bereiken is een lijstje te genereren met tuples van (func, func) die mij vervolgens weer, gegeven een board, een field kunnen aanreiken. Maar dat lijstje is enkel voor blank fields. Dus daar gaan we:

Haskell:
1
2
3
findblanks :: Board -> [(a, b)]
findblanks board = filter (\(row,col) -> col (row board) == B) list
    where list = [(fst3, fst3), (fst3, scn3), (fst3, thrd3), (scn3, fst3), (scn3, scn3), (scn3, thrd3), (thrd3, fst3), (thrd3, scn3), (thrd3, thrd3)]


(Disclaimer: ja, de lijst met combinaties is nou niet bepaald uitbreid-vriendelijk, maar it'll have to do.... )

Echter krijg ik zoals enkelen van jullie met ervaring in leren van functioneel, wat problemen met types matchen. Op één of andere manier "zie" ik het gewoon even niet..... |:(


[...]
Okay, laten we eens kijken naar het begin van de type error:
Couldn't match expected type `b' with actual type `Row -> Field'
`b' is a rigid type variable bound by
the type signature for findblanks :: Board -> [(a, b)]
at Main.hs:143:15
(N.B.: In mijn GHC staat er (Field, Field, Field) i.p.v. Row)

GHC heeft uitgevogeld dat een bepaalde expressie het type Row -> Field heeft, maar jij geeft aan dat die expressie het polymorfe type b heeft. Dit spreekt elkaar tegen en dus levert het een foutmelding op.

Ik zou zeggen, haal deze regel eens weg:
Haskell:
1
findblanks :: Board -> [(a, b)]

Laad vervolgens je file in GHCi en vraag eens wat het type is:
ghci> :t findblanks
findblanks
  :: ((Field, Field, Field),
      (Field, Field, Field),
      (Field, Field, Field))
     -> [(((Field, Field, Field),
           (Field, Field, Field),
           (Field, Field, Field))
          -> (Field, Field, Field),
          (Field, Field, Field) -> Field)]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Hmm, grappig dat je ghci erbij pakt, heb ik bij een eerdere poging ook gedaan en toen kwam dit er ook ongeveer uit. Praktisch betekent dit dat ik eigenlijk heb wat ik wens, met een dergelijk tuple kan ik van een Board naar een Field!

Om er dan nog een leerzaam moment van te maken ben ik benieuwd naar waarom ghc niet met m'n type signature eens was. In principe is die output van GHCI toch hetzelfde als (a,b) , en zou ghc toch gewoon kunnen accepteren dat het een iets specifiekere instantie dan (a,b) is?

edit: Ah! Ik zeg met m'n type signature dat het heel algemeen kan, en de compiler zegt dat het alleen met specifieke types van a en b kan! Thanks :)

[ Voor 12% gewijzigd door afraca op 06-10-2013 18:55 ]

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 10:53

RayNbow

Kirika <3

afraca schreef op zondag 06 oktober 2013 @ 18:52:
edit: Ah! Ik zeg met m'n type signature dat het heel algemeen kan, en de compiler zegt dat het alleen met specifieke types van a en b kan! Thanks :)
Juist :)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir