小编Jam*_*rbo的帖子

从列表初始化代数数据类型

我是一个相当新的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)

我错过了什么?

haskell list algebraic-data-types

9
推荐指数
3
解决办法
1070
查看次数

Haskell:aeson,OverloadedStrings和Text.Regex.PCRE

我有一个正则表达式使用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)

regex haskell aeson

1
推荐指数
1
解决办法
261
查看次数

标签 统计

haskell ×2

aeson ×1

algebraic-data-types ×1

list ×1

regex ×1