vorherige Seite | 1 2 |
Gepostet: |
|||||||||||
Eine direkte Übersetzung nach Java sähe so aus (ungetestet)
Die Formel wurde ziemlich seltsam geschrieben, z.B. ist das Quadrat von -n ja das gleiche wie von n. Das n <- [fromIntegral i] taucht in der Übersetzung gar nicht auf, weil man in Java ints auch an Stellen verwenden kann, wo doubles erwartet werden, aber in Haskell nicht. Üblicherweise würde man das allerdings so schreiben:
Die let-Anweisung definiert direkt eine neue Variable, man braucht also nicht wie im Original-Code mit einer einelementigen Liste zu tricksen. Falls dir die Schreibweise [x*y| x<- [1..3], y <- [4..5]] gar nichts sagt, ist das Schlagwort \"List Comprehension\": http://www.haskell.org/haskellwiki/List_comprehension |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
... ein wenig wurde erledigt -:) | ||||||||||
import Debug.Trace import System.IO.Unsafe import Debug.Hood.Observe inhomoSum :: RealFloat a => [a] -> a inhomoSum xs = sum [ ((s1 n)**2 + (s2 n)**2) / n**2 | i <- [1..huge], n <- [fromIntegral i] ] where s1 n = let result = sum [ cos (2 * pi * n * x) | x <- xs ] in output result (\"s1 n: \" ++ show n ++ \" = \" ++ show result) s2 n = let result = sum [ sin (2 * pi * n * x) | x <- xs ] in output result (\"s2 n: \" ++ show n ++ \" = \" ++ show result) huge = 3 output :: Show b => a -> b -> a output a text = unsafePerformIO $ print text >> return a inhomoSignificance :: RealFloat a => [a] -> a inhomoSignificance xs | xs == [] = error \"inhomoSignificance undefined for empty list\" | otherwise = prob (inhomoSum xs / count) where count = fromIntegral (length xs) prob x = let result = limit ( sum [ (if i < huge then 2 else 1) * (-1)**(n-1) * exp (-n**2 * x) | i <- [1..huge], n <- [fromIntegral i] ] ) in output result (\"prob x: \" ++ show x ++ \" ...-= \" ++ show result) limit = (min 1 . max 0) huge = 3 inhomogeneity :: RealFloat a => [a] -> a inhomogeneity xs | xs == [] = error \"inhomogenity undefined for empty list\" | length xs == 1 = error \"inhomogenity undefined for single value\" | otherwise = sqrt ( limit ( (inhomoSum xs * 6 / pi**2 - 1) / (count**2 - 1) ) ) where count = fromIntegral (length xs) limit = max 0 Die Ausgabe ist mir noch nicht ganz klar ... inhomoSignificance [0.96195316,0.87144583, 0.05623686, 0.94955665, 0.36401868] \"prob x: \"s1 n: 1.0 = 2.894440757078356\" \"s2 n: 1.0 = -0.1709560566435756\" \"s1 n: 2.0 = 2.271902746882097\" \"s2 n: 2.0 = -2.3925599662305053\" \"s1 n: 3.0 = 1.9079908081366614\" \"s2 n: 3.0 = -0.7102717235849991\" 2.317806136856376 ...-= 0.1967906565726379\" 0.1967906565726379 was ich erreichen möchte ist, dass mein vba programm das Haskell vice versa überprüft .. jedoch macht mir dieswe limit - anweisung mit min max probleme darf ich im Zusammenhang mit Haskell davon ausgehen, dass sich hier programme aufrufen, die dann abgearbeitet werde? inhomoSum kann ich kontrollieren - ... aber sionst fehlt der Durchblick wie komme ich an die Auswertung heran .. oder ist das illusorisch, da inhomoSum \"geschlpssen\" ist oder brauche ioch eione andere Art der Auswertung ...?? |
|||||||||||
Zum Seitenanfang | Homepage | ||||||||||
Gepostet: |
.. danke für den java-sourcecode vorschlag | ||||||||||
... mir bereitet die schreibweise (min 1 . max 0) schwierigkeiten .. ggf. wird das nach studium deines java programms aus der welt geschafft sein .. lg HT |
|||||||||||
Zum Seitenanfang | Homepage | ||||||||||
Gepostet: |
|||||||||||
Habe ich doch schon weiter oben geklärt, das fällt unter den \"point free\"-Stil. Betrachten wir einmal folgende Funktion:
Was die tut, sollte klar sein: Sie berechnet das Maximum 0 und x. Was tut nun folgende Funktion?
Überraschung, sie tut genau das gleiche! Falls du nicht weißt, warum, schlag unter \"Currying\" nach. Das gleiche gilt für min 1. Der Ausdruck (f . g) x ist definiert ist als f (g x), z.B. ist ((2*).(1+)) 3 das gleiche wie 2*(1+3), also 8. Deshalb ist umgekehrt
das gleiche wie
oder durch Weglassen von x wie ganz oben
|
|||||||||||
Zum Seitenanfang | |||||||||||
vorherige Seite | 1 2 |