【问题标题】:Haskell: Convert input string directly to listHaskell:将输入字符串直接转换为列表
【发布时间】:2017-03-11 17:44:47
【问题描述】:

有没有办法将输入字符串直接转换为列表?

输入的字符串已经是列表的形式,例如:

[((1,2),x),((3,2),y)]

我只想将它转换为[((1,2),x),((3,2),y)],它可以在另一个函数中使用,而不必通过字符串来获取所有值,然后制作一个相同的列表。

这可能吗?

【问题讨论】:

  • xy 是什么?
  • 你要read吗?
  • x 和 y 是我自己定义的类型。 Read 只是用于将一串数字转换为 int 不是吗?
  • 您的输入字符串引用了变量名?
  • 输入字符串的格式为 [((Int,Int), Animal)] 其中 Animal = Dog |猫,所以没有对变量名的引用,只有类型。

标签: string list haskell


【解决方案1】:

您只需要为您的类型定义一个Read 实例。

> data Animal = Dog | Cat deriving (Read, Show)
> read "[((1,2),Dog),((3,2),Cat)]" :: [((Int, Int), Animal)]
[((1,2),Dog),((3,2),Cat)]

【讨论】:

  • 非常感谢!工作完美!几个小时的谷歌搜索,但解决方案是如此简单......再次感谢!
【解决方案2】:

如前所述,您可以使用read 将您的String 转换为[((Int, Int), Animal)] 类型的值,前提是AnimalRead 的一个实例。实例可以自动派生:

data Animal = Dog | Cat deriving (Show, Read)

另一个潜在的陷阱是您应该明确指定类型注释,以便read 知道要解析什么:

main :: IO ()
main =
    do let list = read "[((1,2),Dog),((3,2),Cat)]" :: [((Int, Int), Animal)]
        animals = map snd list
    print animals

输出:

$ runhaskell test.hs
[Dog,Cat]

【讨论】:

  • 谢谢!我应该指定类型注释,即使它有效,还是主要是为了安全/防止将来出现错误?
  • 查看read的类型:read :: Read a => String -> a。如果您约束类型变量a 使其完全明确(​​通过在使类型清晰的上下文中使用read 的结果),那么编译器将知道要使用哪个Read 实例,您将不会不需要添加注释。在其他情况下,就像我上面的代码一样,它会抱怨类型变量不明确。
  • 好的!谢谢
猜你喜欢
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
相关资源
最近更新 更多