返回相同数据类型的不同值:

时间:2013-12-27 18:01:31

标签: haskell

我正在编写readValue函数,该函数可以返回任何Value代数数据类型。 Value的值构造函数未导出,因此如何返回Value

这里是documentation on Value

以下是函数及其产生的错误:

readValue :: Label -> String -> Value
readValue label valueString =
  case label of
    "tags" -> (read valueString :: [String])
    "text" -> (read valueString :: String)


src/Edit.hs:79:16:
    Couldn't match type `Char' with `[Char]'
    Expected type: [String]
      Actual type: String
    In the expression: (read valueString :: String)
    In a case alternative: "text" -> (read valueString :: String)
    In the expression:
      case label of {
        "tags" -> (read valueString :: [String])
        "text" -> (read valueString :: String) }

2 个答案:

答案 0 :(得分:1)

你有:

readValue :: Label -> Value

你想:

readValue :: Label -> String -> Value

可是:

(read valueString :: [String])

输入[String],因为这是您明确指定的类型。回想一下,::具有最低优先级。因此,编译器正在尝试将String -> [String]Value统一起来。这是你第一次错误的来源。第二个错误是由:: String的第二个分支上的case注释引起的,要求编译器尝试将String[String]统一,这也会失败。

我想你想把你读过的这些值包装到一些Value构造函数中,这些构造函数确实是由Data.Bson导出的,否则你会尝试从一个函数返回多个不同的类型。但是,如果不了解您的问题,我无法推断您的意图。

答案 1 :(得分:1)

以下是解决方案:

instance Val Value where
  val   = id
  cast' = Just

readValue :: Label -> String -> Value
readValue label valueString =
  case label of
    "tags" -> val (read valueString :: [String])
    "text" -> val  (read valueString :: String)