Jestem całkiem nowym programistą Haskella i próbuję wymyślić, jak wprowadzić pewne wartości do algebraicznego typu danych.Inicjowanie algebraicznego typu danych z listy
mam typ rekordu danych:
data OrbitElements = OrbitElements { epoch :: Double,
ecc :: Double,
distPeri :: Double,
incl :: Double,
longAscNode :: Double,
argPeri :: Double,
timePeri :: Double,
meanMotion :: Double,
meanAnomaly :: Double,
trueAnomaly :: Double,
semiMajorAxis :: Double,
distApo :: Double,
period :: Double
}
ja ciągnąc w jakiejś informacji z pliku tekstowego, który kończy się na liście Doubles. Czy istnieje prosty sposób na zainicjowanie tego typu danych za pomocą listy? Mogę po prostu zadzwonić do każdego setera indywidualnie ale to wydaje się strasznie nieefektywne, gdy już mam wszystkie wartości na liście.
let d = [2456382.5,6.786842103348031e-3,0.7184187640759256,3.394660181513041,76.64395338801751,55.2296201483587,2456457.141012543,1.602144936476915,240.4142797010899,239.7408018186761,0.7233278761603762,0.7282369882448266,224.6987721295883]
let o = OrbitElements
let epoch o = d !! 0
let ecc o = d !! 1
-- and so on
Czego mi brakuje?
Dzięki, ten potwierdził moje podejrzenia, a każda odpowiedź, że zaczyna się „Najpierw definiujemy dwa parsery ... "jest świetny w mojej książce :) –
Opcja" odręcznie "staje się przyjemniejsza w połączeniu z [' -XRecordWildCards'] (http://www.haskell.org/ghc/docs/7.4 .2/html/users_guide/syntax-extns.html # record-wildcards): 'fromList [epoka, ecc, distPeri, incl, longAscNode, argPeri, timePeri, meanMotion, meanAnomaly, trueAnomaly, semiMajorAxis, distApo, period] = Just OrbitElements {..} '. –