www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

bene

Gepostet:
13.02.2007 13:59

Hakell-Stil  
Hallo Haskellianer,
Ich würde gern mal eure Meinung zu diesem Programm hören. Ist das halbwegs haskellmäßig, ich bin mir da noch sehr unsicher.
Manches ist da imho ziemlich kryptisch und schwer zu lesen, wie würdet ihr das schreiben?
Oder kommt mir das nur aufgrund meiner mangelnden Erfahrung so unleserlich vor?
Insbesondere die letzte Zeile in positions', die eigentlich die ganze Arbeit macht. Wie hättet ihr die Fallunterscheidung gelöst?

Das ganze soll die Positionen in Termen auflisten. Einen Term kann man als als Baum sehen, der aus Funktionssymbolen und Variablensymbolen aufgebaut ist. Die Blätter sind konstante Funktionssymbole (ohne Argumente) und Variablensymbole.
zB: f(x, g(a(), y), b())
mit Funktionssymbolen: f, g, a, b
und Variablensymbolen: x, y

f ist die Wurzel hat also Position []
x ist das erste Argument hat Position [1]
g(a(), y) hat Pos [2]
b() hat Pos [3]
so steigt man rekursiv ab:
a() hat Pos [2,1]
y hat Pos [2,2]

positions gibt also eine Liste von Listen von Ints zurück. Für das Beispiel: [[],[1],[2],[2,1],[2,2],[3]]
varPositions eine Teilmenge davon, nämlich nur die Positionen von Variablensymbolen: [[1],[2,2]]
analog für Positionen von Funktionssymbolen: [[],[2],[2,1],3]

Ich hoffe, dass ich das halbwegs verständlich erklärt habe...
Hier der Code:
module Term (Term, isVariable, positions, funPositions, varPositions) where
import Function
import Variable

type Pos = [Int]

data Term = F (Function Term) | V Variable

isVariable :: Term -> Bool
isVariable (F _) = False
isVariable (V _) = True

-- Hilfstyp zur Fallunterscheidung in positions'
data Ptype = All | Var | Fun
instance Eq Ptype where
All == All = True
Var == Var = True
Fun == Fun = True
x == y = False

-- my ... aktuelle Position in der Rekursion
positions' :: Ptype -> Pos -> Term -> [Pos]
positions' pt my (V _) = let pos | pt == All = [my]
| pt == Var = [my]
| pt == Fun = []
in pos
positions' pt my (F t) = let pos | pt == All = [my]
| pt == Var = []
| pt == Fun = [my]
-- arity liefert die Anzahl der Argumente und args die Argumente selbst. Beide aus Function
-- *********** Das kann ich in zwei Wochen sicher nicht mehr lesen! **********************
in pos ++ concat (map (\(p,a) -> positions' pt (my++[p]) a) (zip [1..(arity t)] (args t)))

-- liefert alle Positionen im Term
positions :: Term -> [Pos]
positions = positions' All []

-- liefert die Positionen aller Funktionssymbole
funPositions :: Term -> [Pos]
funPositions = positions' Fun []

-- liegert die Positionen aller Variablensymbole
varPositions :: Term -> [Pos]
varPositions = positions' Var []

-- Terme zum Testen
v = V (var "x")
f = F (func "s" [v,k,v,k])
k = F (func "k" [])
f2 = F (func "r" [v,f,k,f])

{-
Term> positions f
[[],[1],[2],[3],[4]]
Term> varPositions f
[[1],[3]]
Term> funPositions f
[[],[2],[4]]

Term> funPositions f2
[[],[2],[2,2],[2,4],[3],[4],[4,2],[4,4]]
Term> varPositions f2
[[1],[2,1],[2,3],[4,1],[4,3]]
Term> positions f2
[[],[1],[2],[2,1],[2,2],[2,3],[2,4],[3],[4],[4,1],[4,2],[4,3],[4,4]]

Das stimmt soweit...
-}


liebe Grüße,
Bene
Zum Seitenanfang    
 
Jacke

Gepostet:
13.02.2007 21:01

   
ich finde deine funktionen sehr übersichtlich. Smilie

man hätte die fall unterscheidung noch mit nen oder zusammenfassen können...aber das macht es nicht unbedingt verständlicher

| (pt == Var)|| (pt == All) = [my]


gruß JackeSmilie
Zum Seitenanfang    
 
bene

Gepostet:
14.02.2007 14:13

   
Danke für dein Feedback! Ich muss mein Hirn wohl erst an Haskell bzw. funktionale Programmierung gewöhnen ;)
Kennst du vielleicht ein gutes (ich meine damit einfach zu bedienendes) Parserframework? (Davon gibs für Haskell ja sicher einige)
Das ganze soll nämlich ein einfaches Termersetzungssystem werden, wenns fertig ist. Ist ein Uniprojekt.
lg, Bene
Zum Seitenanfang    
 
Blacksoul

Gepostet:
14.02.2007 21:15

   
"Parserframework"

-> Müsste sowas wie >WinHugs< sein, oder? Also mit dem du die Programme ausführen kannst...
zu deinem script kann ich wenig sagen, da ich so gut haskell selber nicht kann xD
Zum Seitenanfang    
 
Jacke

Gepostet:
15.02.2007 07:58

   
Ich benutze Hugs98 und Jedit zum Programmieren. Jedit beherrscht nämlich syntaxhighligthing für Haskell

gruß Jacke
Zum Seitenanfang    
 
bene

Gepostet:
15.02.2007 12:40

   
Ich probiers jetzt mal mit Parsec, eine Alternative wäre Happy. Naja ich experimentier mal ein bisschen damit herum.
lg, Bene
Zum Seitenanfang    
 
Jacke

Gepostet:
15.02.2007 22:32

   
^^ hab ich noch nie von gehört...kannst du mal den lin posten ? man lernt ja nie aus

gruß JackeSmilie
Zum Seitenanfang