在Haskell中从字符串推断类型

moiiocjp  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(158)

我正在Haskell中开发一个JSON数据编码器!(更具体地说,我正在尝试将Jo移植到Haskell中!)。我已经做了很多工作,但是我遇到了一个小问题。我将在这里尽量简洁地提出我的问题,我已经尝试尽可能地去除不必要的上下文。
目标:给定一个String,构造一个Value
这些字符串来自命令行:用户以<key>=<value>的形式输入键/值对,将它们拆分后,剩下的是String,它是未知类型的值数据。
示例案例:

let s = "someString" -- use the `String` constructor
let s = "1234"       -- use the `Number` constructor
let s = "True"       -- use the `Bool` constructor

问题:如何推断s的内容是String,而不是NumberBool等?

这是Aeson Value类型的相关类型+构造函数(为简洁起见进行了编辑)。

data Value = Object Object
           | Array Array
           | String Text
           | Number Scientific
           | Bool Bool
           | Null
c3frrgcw

c3frrgcw1#

既然你已经在使用 aeson 包了,你就可以使用decode,因为Value也是一个ByteString示例:

Prelude Data.Aeson> decode "\"someString\"" :: Maybe Value
Just (String "someString")
Prelude Data.Aeson> decode "1234" :: Maybe Value
Just (Number 1234.0)
Prelude Data.Aeson> decode "true" :: Maybe Value
Just (Bool True)

请注意(正如 * n.1.8e9-where 's-my-share m.* 在注解中指出的),字符串必须用引号引起来。
那么,你可以做的就是把你的未知值用引号括起来,然后尝试解析它,然后再尝试解析一次,不要用引号括起来。
现在有两个Maybe Value值。选择第一个Just值(并准备处理Nothing情况)。

相关问题