Toon posts:

[Haskell] Window maken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil een window maken met Haskell(GHC). Daar stond in de definitie van het type van de functie iets ongebegrijpelijks voor mij(nl. de ls, de wdef, en de ps).

class Windows wdef where

Methods
openWindow :: ls -> wdef ls ps -> ps -> GUI ps ps

Instances
(Controls c) => Windows (Window c)

Toen heb ik maar een paar tutorials doorgespit, en daar stond het volgende in

class Functor f where
fmap :: (a -> b) -> f a -> f b

The fmap function generalizes the map function used previously. Note that the type variable f is applied to other types in f a and f b. Thus we would expect it to be bound to a type such as Tree which can be applied to an argument. An instance of Functor for type Tree would be:

instance Functor Tree where
fmap f (Leaf x) = Leaf (f x)
fmap f (Branch t1 t2) = Branch (fmap f t1) (fmap f t2)

f lijkt me een functie in de instance, maar wat is f in het type?

Hieruit concludeer ik dat ik een instantie van een Window moet maken, maar ik weet niet van welk type die wfed,ls en ps zijn, dus ook niet hoe ik het dan werkend kan krijgen. Kan iemand me hierover iets uitleggen?

Ik heb ook FranTk en een aantal andere GUI-libs gedownload, maar ik vind het een beetje irritant, dat je voor bijv. GTK+HS geloof ik wel een stuk of 6 of 7 dingen moet downloaden, voordat je zelfs kunt beginnen(niet erg uitnodigend). :?

In Hugs hebben ze een voorbeeld van HelloWorld gemaakt, maar ze hebben die GUI-lib van hun weer half ingebouwd, zodat je hem niet direct met GHC kunt gebruiken. :?

Het is misschien iets te sterk uitgedrukt, maar het lijkt net of niemand wil dat je Haskell gebruikt.

Verwijderd

Weet je wat zgn. type-classes zijn?


--
over die Functor. Wat misschien verwarrend is:

f is een type (nou ja, eigenlijk een type functie want hij mist nog een parameter) op deze plaats:

code:
1
2
class Functor f where
fmap :: (a -> b) -> f a -> f b


Maar f is een functie (van a->b) hier:

code:
1
2
instance Functor Tree where
fmap f (Leaf x) = Leaf (f x)


N.B. Met functor kan je een map definieren voor andere datatypen. Een hele bekende:

code:
1
2
instance Functor [] where
   fmap = map

[ Voor 112% gewijzigd door Verwijderd op 19-04-2003 15:39 ]


Verwijderd

Topicstarter
class Functor f where
fmap :: (a -> b) -> f a -> f b

Maar f is een functie (van a->b) hier:

code:
1
2
instance Functor Tree where
fmap f (Leaf x) = Leaf (f x)


Dus de f van Functor f wordt in de instance vervangen door Tree. En in het type van fmap ook.
fmap :: (a -> b) -> f a -> f b
Als het over een Tree gaat, dan is de f hier Tree, of zie ik dat verkeerd?
Dus fmap::(a->b)->Tree a->Tree b

Maar wat heeft die Window dan nodig (het lijkt net een constructor, die wdef ls ps, maar dat lijkt me toch raar...)?

[ Voor 24% gewijzigd door Verwijderd op 19-04-2003 15:59 ]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 10-08 15:15
Als het over een Tree gaat, dan is de f hier Tree, of zie ik dat verkeerd?
Ja.
Maar wat heeft die Window dan nodig
Tja, dan komen we eigenlijk op het belangrijkste punt uit: je hoeft als het goed is niet zo diep in de code van de library te duiken. Ik weet niet wat voor library je gebruikt, maar ik hoop voor je dat er redelijk wat documentatie bij zit die uitlegt met wat voor functies je windows kan maken, wat je moet doen om de eigenschappen (controls) daarvan in te stellen en hoe je kan reageren op acties in dat window.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Topicstarter
Ik gebruik de GHC ObjectIO library, maar veel meer als dit stond er niet over openWindow. Ik heb overigens maar aangenomen dat je openWindow moet gebruiken om een window te maken aangezien er geen createWindow o.i.d. was. Hoe moet je anders een Window maken?

Als je twee verschillende GUI libs hebt, kun je die dan ook combineren (bijv. een Window van de een als input gebruiken voor de andere)? Waarschijnlijk moet je er dan eerst een brug tussenslaan, maar zo handig ben ik nog lang niet..., Arie
putStr (map (\x -> chr (round (21.0/.2.0 *. x^.3 -. 92.0 *. x^.2 +. 503.0/.2.0 *. x -. 105.0))) [1.0,2.0,3.0,4.0])
In Helium :)

[ Voor 13% gewijzigd door Verwijderd op 20-04-2003 12:55 ]


  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Verwijderd schreef op 19 April 2003 @ 15:55:
class Functor f where
fmap :: (a -> b) -> f a -> f b

Maar f is een functie (van a->b) hier:

code:
1
2
instance Functor Tree where
fmap f (Leaf x) = Leaf (f x)


Dus de f van Functor f wordt in de instance vervangen door Tree. En in het type van fmap ook.
fmap :: (a -> b) -> f a -> f b
Als het over een Tree gaat, dan is de f hier Tree, of zie ik dat verkeerd?
Dus fmap::(a->b)->Tree a->Tree b

Maar wat heeft die Window dan nodig (het lijkt net een constructor, die wdef ls ps, maar dat lijkt me toch raar...)?
de 'f' in de instancedefinitie Functor Tree heeft niets te maken met de 'f' in de classdefinitie van Functor: het zijn andere namespaces; de ene f is een typevariabele, de andere een gewone variabele (nu ja, een variabele functie).

wdef is hier inderdaad een constructor (een variabele, dat wel). wat wdef, ls en ps zijn zou je in de manual moeten kunnen vinden.

nog een laatste noot over GUI in haskell. er is nog geen gestandaardiseerde library, daar wordt nog heftig over onderhandeld op de mailinglist gui@haskell.org. het beste is om te wachten (en misschien intussen mee te helpen :)) tot er een standaard is voor GUI in haskell. als je daar niet op kunt/wilt wachten, zou je eens naar FranTk kunnen kijken (als alternatief voor ObjectIO).

Pas de replâtrage, la structure est pourrie.

Pagina: 1