Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Klasser i Haskell?

Postades av 2006-12-01 13:14:42 - Niklas Jansson, i forum Skrivklåda, Tråden har 3 Kommentarer och lästs av 797 personer

Har lite problem med klasser i Haskell.
Jag skulle vilja ha en generell klass "vektor", för allmäna vektorrum. (Detta är för en enkel ODE-applikation.)

Då tänker jag att följande är rimligt:
class Vector a where
(<*>) :: Num b => b -> a -> a
(<+>) :: a -> a -> a

Alltså en instans a av en vektor ska kunna bli multiplicerad med en skalär och ska kunna bli adderad med en annan vektor.
Det tycks vara ok, sen försöker jag med:

data Vec1 a = Vec1 {u::a}

instance (Num a) => Vector (Vec1 a) where
(Vec1 x) <+> (Vec1 y) = (Vec1 x)
x <*> (Vec1 y) = (Vec1 (x*y))

Men <*> fullkomligt vägrar den att acceptera:

ERROR "RungeKutta.hs":17 - Inferred type is not general enough
*** Expression : (<*>)
*** Expected type : (Vector (Vec1 a), Num b) => b -> Vec1 a -> Vec1 a
*** Inferred type : (Vector (Vec1 a), Num a) => a -> Vec1 a -> Vec1 a

Antar att det är något enkelt problem, någon som har en förklaring?


Svara

Sv: Klasser i Haskell?

Postades av 2006-12-01 16:23:03 - Per Persson

I <b>x <*> (Vec1 y) = (Vec1 (x*y))</b> måste x och y tillhöra samma typ, och denna typ måste implementera klassen Num. Men enligt dina typdeklarationer räcker det om x och y har olika typer som var för sig implementerar klassen Num. (Skall erkänna att jag är litet osäker...)

Undrar om du inte måste ange även skalärtypen i Vector-klassen:
-- Anger att a är en vektor över b
class Num b => Vector a b where
(<*>) :: b -> a -> a
(<+>) :: a -> a -> a

data Vec1 a = Vec1 {u::a}

instance (Num a) => Vector (Vec1 a) a where
(Vec1 x) <+> (Vec1 y) = (Vec1 x)
x <*> (Vec1 y) = (Vec1 (x*y))

Skall installera Hugs och testa...


Svara

Sv:Klasser i Haskell?

Postades av 2006-12-01 17:20:10 - Per Persson

Detta funkar i Hugs:

class Vector v where
(<+>) :: Num a => v a -> v a -> v a
(<*>) :: Num a => a -> v a -> v a

newtype Num a => Vec a = Vec a
deriving Show

instance Vector Vec where
(Vec x) <+> (Vec y) = Vec (x + y)
c <*> (Vec x) = Vec (c * x)


Svara

Sv: Klasser i Haskell?

Postades av 2006-12-02 20:28:59 - Niklas Jansson

Perfekt!
Efter en hel del krånglande har jag nu fått ordning på hela grejen. En komplett utbyggbar RungeKutta-lösare av andra ordningen för godtyckliga vektorrum på 75 rader inklusive tomrader.

import IO
class Vector v where
(<+>) :: Num a => v a -> v a -> v a
(<*>) :: Num a => a -> v a -> v a




newtype Num a => Scalar a = Scalar a

instance Num a => Show (Scalar a) where
show (Scalar x) = (show x)

instance Vector Scalar where
(Scalar x) <+> (Scalar y) = Scalar (x + y)
c <*> (Scalar x) = Scalar (c * x)



data Num a => Vec2 a = Vec2 a a

instance Num a => Show (Vec2 a) where
show (Vec2 x y) = (show x) ++ " " ++ (show y)

instance Vector Vec2 where
(Vec2 x1 y1) <+> (Vec2 x2 y2) = Vec2 (x1 + x2) (y1 + y2)
c <*> (Vec2 x y) = Vec2 (c * x) (c * y)




f :: (Num a, Num b) => b -> Scalar a -> Scalar a
f t x = x

g :: Num a => a -> Vec2 a -> Vec2 a
g t (Vec2 u v) = Vec2 (u + v) (v - u)


runge_kutta :: (Ord a, Num a, Vector b) => (a -> b a -> b a) ->
b a -> a -> a -> a -> [(b a, a)]

runge_kutta f y0 t0 tmax tstep
| t0>tmax = []
| otherwise = (y1,t1) : (runge_kutta f y1 t1 tmax tstep)
where
y1 = runge_kutta_aux f y0 t0 tmax tstep
t1 = t0 + tstep

runge_kutta_aux :: (Num a, Vector b) => (a -> b a -> b a) ->
b a -> a -> a -> a -> b a

runge_kutta_aux f y0 t0 tmax tstep =
y0 <+> k2
where
k1 = tstep <*> (f t0 y0)
k2 = tstep <*> (f (t0+tstep) (y0 <+> k1))


out_to_matlab result = "y = [" ++ unlines (map (++ ";") (map show y)) ++ "]\n"
where
(y,t) = unzip(result)



calc_final_result =
out_to_matlab final_result
where
final_result = runge_kutta f (Scalar 1) 0 5 0.001
-- final_result = runge_kutta g (Vec2 0.1 0.5) 0 5 0.001


main = do
handle <- openFile "output.m" WriteMode
hPutStr handle calc_final_result


Nu ska vi bara se om vi kan få ordning på en matris också.


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 169
27 953
271 705
688
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies