在Haskell中从字符串推断类型



我正在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而不是Number,Bool等?

这是AesonValue类型的相关类型+构造函数(为简洁而编辑)。

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

既然您已经在使用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情况)。

相关内容

最新更新