我正在编写readValue
函数,该函数可以返回任何Value
代数数据类型。 Value
的值构造函数未导出,因此如何返回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) }
答案 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)