15.07.2007 19:15
- oppdatert 306 dager siden av Terje Pedersen
Record med navngitte felt
Jeg har sett på record i Haskell og da spesielt de med navngitte felt. Har også funnet ut at et forslag til nytt språk på en blogg egentlig nesten kunne skrives i Haskell.
I Haskell blir disse navngitte feltene gjort om til funksjoner som tar en record som parameter slik at en kan skrive firstname adr for å ta ut fornavnet fra adr som vist i showAddress.
Den andre måten å hente ut på er vist i showAddress2 hvor en bruker pattern matching. Er det flere måter?
- data Address = Address {firstname :: String, lastname :: String, age :: Int}
- adr = Address {firstname = "Terje", lastname = "Pedersen", age = 31}
- showAddress :: Address -> String
- showAddress a = firstname a ++ " age is " ++ show (age a)
- showAddress2 :: Address -> String
- showAddress2 Address {lastname = ln} = "Last name: " ++ ln
- main = do
- print $ showAddress adr
- print $ showAddress2 adr
I forbindelse når jeg har sittet å lekt meg men syntax til mitt eget lille språk Minky så kom jeg over blogg-innlegget Designing a simple programming language
Bloggerens forslag ser slik ut:
- model student:
- part name = "unknown"
- part age = 0
- part score = 0
- my_student_model = model student ( name = "Sandy P. Schmoe", age = 16, score = 75 )
- if my_student_model.score >= 90 then:
- print "The student is going to Disneyland! Hooray!"
- but if my_student_model.score >= 80 then:
- print "The student is getting a new Superman Returns toy!"
- otherwise:
- print "The student is going to be tutored over the summer =("
Jeg har prøvd å skrive det så likt som mulig i Haskell og kom da frem til følgende:
- data Student = Student {
- name :: String,
- age :: Int,
- score :: Int
- }
- my_student_model = Student { name = "Sandy P. Schmoe", age = 16, score = 75 }
- main =
- if score my_student_model >= 90 then
- print "The student is going to Disneyland! Hooray!"
- else if score my_student_model >= 80 then
- print "The student is getting a new Superman Returns toy!"
- else
- print "The student is going to be tutored over the summer =("
Mao ikke så veldig store forskjellen nei. Går det an å gjøre det enda likere? Vet at jeg har droppet default verdiene, men det kunne vel vært skrevet som:
- student = Student { name = "unknown", age = 0, score = 0 }
- my_student_model = student { name = "Sandy P. Schmoe", age = 16, score = 75 }
permalink |
kommentarer (0)
15.07.2007 17:17
- oppdatert 306 dager siden av Terje Pedersen
GTK2HS
I dag har jeg sett litt på gtk2hs, et bibliotek for å skrive GTK+ applikasjoner i Haskell.
Burde nesten være selvforklarende hva dette lille programmet gjør :p

- import Graphics.UI.Gtk
- import System.Locale (defaultTimeLocale)
- import Time
- clockButtonClicked = do
- let time = getClockTime >>= toCalendarTime
- t <- fmap (formatCalendarTime defaultTimeLocale "%Y-%m-%d %H:%M:%s") time
- print $ "Klokken er: " ++ t
- main = do
- initGUI
- window <- windowNew
- button <- buttonNewWithLabel "Klokken er?"
- window `containerAdd` button
- window `windowSetTitle` "Si tiden"
- window `onDestroy` mainQuit
- button `onClicked` clockButtonClicked
- windowResize window 200 20
- widgetShowAll window
- mainGUI
permalink |
kommentarer (0)
15.07.2007 03:19
- oppdatert 307 dager siden av Terje Pedersen
HSQL - Haskell SQL
De siste par dagene har jeg lagt ut på en ferd for å lære meg Haskell, har satt de små grå på en skikkelig prøve. Ikke alt er like enkelt å forstå, blant annet gjelder dette Monad eller skal vi si Mona(d) ja omtrent like vanskelig å forstå seg på som jenter til tider, men skal vel knekke den koden også.
Jeg kom over et blogg-innlegg hvor vedkommende hadde problemer med at ikke det kom mer feilmelding enn “Exception: (unknown)” noe det ikke var så vanskelig å finne ut av hvordan løse. Verre var det å få ut noe data og prøve å få redusert koden litt.
Om noen har forslag til forbedringer / forenklinger så hyl ut, jeg er helt fersk med Haskell, men her nå min kode med HSQL for å hente ut noen rader fra en tabell.
- import Database.HSQL.MySQL (connect)
- import Database.HSQL
- import Control.Exception
- import Monad (liftM2)
- retrieveRecords c = query c "SELECT nick, name from user" >>= collectRows getRow
- where getRow :: Statement -> IO (String,String)
- getRow stmt = liftM2 (,) (getFieldValue stmt "nick")
- (getFieldValue stmt "name")
- main =
- catchDyn (do
- c <- connect "localhost" "din_database" "din_bruker" "ditt_passord"
- l <- retrieveRecords c
- let loop [] _ = return ()
- loop (head:tail) f = f head >> loop tail f
- loop l (\x -> print x)
- disconnect c)
- handler
- where
- handler :: SqlError -> IO ()
- handler err = print err
Skriver ut følgende innhold fra min database:
- ("senikk","Terje Pedersen")
- ("cornet86","Cato Pedersen")
liftM2:
- getRow stmt = liftM2 (,) (getFieldValue stmt "nick") (getFieldValue stmt "name")
- getRow stmt = do
- nick <- getFieldValue stmt "nick"
- name <- getFieldValue stmt "name"
- return (nick, name)
permalink |
kommentarer (1)




