Innlegg er skrevet om:
Down 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?

  1. data Address = Address {firstname :: String, lastname :: String, age :: Int}
  2. adr = Address {firstname = "Terje", lastname = "Pedersen", age = 31}
  3. showAddress :: Address -> String
  4. showAddress a = firstname a ++ " age is " ++ show (age a)
  5. showAddress2 :: Address -> String
  6. showAddress2 Address {lastname = ln} = "Last name: " ++ ln
  7. main = do
  8. print $ showAddress adr
  9. 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:

  1. model student:
  2. part name = "unknown"
  3. part age = 0
  4. part score = 0
  5. my_student_model = model student ( name = "Sandy P. Schmoe", age = 16, score = 75 )
  6. if my_student_model.score >= 90 then:
  7. print "The student is going to Disneyland! Hooray!"
  8. but if my_student_model.score >= 80 then:
  9. print "The student is getting a new Superman Returns toy!"
  10. otherwise:
  11. 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:

  1. data Student = Student {
  2. name :: String,
  3. age :: Int,
  4. score :: Int
  5. }
  6. my_student_model = Student { name = "Sandy P. Schmoe", age = 16, score = 75 }
  7. main =
  8. if score my_student_model >= 90 then
  9. print "The student is going to Disneyland! Hooray!"
  10. else if score my_student_model >= 80 then
  11. print "The student is getting a new Superman Returns toy!"
  12. else
  13. 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:

  1. student = Student { name = "unknown", age = 0, score = 0 }
  2. my_student_model = student { name = "Sandy P. Schmoe", age = 16, score = 75 }
Fb permalink | kommentarer (0)
stikkord: haskell
Down 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

  1. import Graphics.UI.Gtk
  2. import System.Locale (defaultTimeLocale)
  3. import Time
  4. clockButtonClicked = do
  5. let time = getClockTime >>= toCalendarTime
  6. t <- fmap (formatCalendarTime defaultTimeLocale "%Y-%m-%d %H:%M:%s") time
  7. print $ "Klokken er: " ++ t
  8. main = do
  9. initGUI
  10. window <- windowNew
  11. button <- buttonNewWithLabel "Klokken er?"
  12. window `containerAdd` button
  13. window `windowSetTitle` "Si tiden"
  14. window `onDestroy` mainQuit
  15. button `onClicked` clockButtonClicked
  16. windowResize window 200 20
  17. widgetShowAll window
  18. mainGUI

gtk2hs demo program

Fb permalink | kommentarer (0)
stikkord: gtk,haskell
Down 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.

  1. import Database.HSQL.MySQL (connect)
  2. import Database.HSQL
  3. import Control.Exception
  4. import Monad (liftM2)
  5. retrieveRecords c = query c "SELECT nick, name from user" >>= collectRows getRow
  6. where getRow :: Statement -> IO (String,String)
  7. getRow stmt = liftM2 (,) (getFieldValue stmt "nick")
  8. (getFieldValue stmt "name")
  9. main =
  10. catchDyn (do
  11. c <- connect "localhost" "din_database" "din_bruker" "ditt_passord"
  12. l <- retrieveRecords c
  13. let loop [] _ = return ()
  14. loop (head:tail) f = f head >> loop tail f
  15. loop l (\x -> print x)
  16. disconnect c)
  17. handler
  18. where
  19. handler :: SqlError -> IO ()
  20. handler err = print err

Skriver ut følgende innhold fra min database:

  1. ("senikk","Terje Pedersen")
  2. ("cornet86","Cato Pedersen")

liftM2:

  1. getRow stmt = liftM2 (,) (getFieldValue stmt "nick") (getFieldValue stmt "name")
Er det samme som å skrive:
  1. getRow stmt = do
  2. nick <- getFieldValue stmt "nick"
  3. name <- getFieldValue stmt "name"
  4. return (nick, name)
Fb permalink | kommentarer (1)
stikkord: haskell
Meta
  • # innlegg
    Feed-icon-12x12205 stk
  • # sider
    Feed-icon-12x1222 stk
  • # lenker
    Feed-icon-12x12149 stk
  • # kommentarer
    Feed-icon-12x12133 stk
Mine eksterne senikk.com Andre blogger
Terje-logo Reklame