我是一个相当新的Haskell程序员,我试图弄清楚如何将一些值转换为代数数据类型.
我有一个记录数据类型:
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
}
Run Code Online (Sandbox Code Playgroud)
我从一个文本文件中提取了一些信息,最终列在双打列表中.有没有一种简单的方法来使用列表初始化此数据类型?我可以单独调用每个setter,但是当我已经拥有列表中的所有值时,这似乎非常低效.
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
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我有一个正则表达式使用Text.Regex.PCRE工作正常:
[[_,_id,_name]] = "199mercury" =~ "(\\d+)(\\w+) :: [[String]]
Run Code Online (Sandbox Code Playgroud)
但是,我在{ - #LANGUAGE OverloadedStrings# - }中添加了使用aeson(json库)并在=〜上获取实例错误:
<interactive>:33:14:
No instances for (RegexMaker Regex CompOption ExecOption source0,
RegexContext Regex source10 target0)
arising from a use of `=~'
Possible fix:
add instance declarations for
(RegexMaker Regex CompOption ExecOption source0,
RegexContext Regex source10 target0)
In the expression: "199mercury" =~ "(\\d+(\\w+)"
In an equation for `it': it = "199mercury" =~ "(\\d+(\\w+)"
Run Code Online (Sandbox Code Playgroud)
搜索修复程序似乎是将正则表达式更改为:
getAllTextSubmatches ("199mercury" =~ "(\\d+(\\w+)" :: AllTextSubmatches [] String)
Run Code Online (Sandbox Code Playgroud)
但这似乎只是给我另一个实例错误:
No instances for (RegexMaker Regex CompOption …Run Code Online (Sandbox Code Playgroud)