如果我的自定义数据类型采用Boolean
的字符串表示形式(即"true"
或"false"
)。如何通过数据类型将其转换为Bool
而不必在输入之前执行操作?
例如
λ: MyData "false"
MyData False
答案 0 :(得分:6)
如果没有函数,通常只需定义一个返回新类型的函数,例如:
newtype MyData = MyData Bool
myData :: String -> MyData
myData "false" = MyData False
myData "true" = MyData True
-- Need to decide how to handle invalid arguments
现在不是写MyData "false"
而是写myData "false"
。
答案 1 :(得分:0)
您还可以在GHC中使用(.)
扩展名,并将您的类型声明为OverloadedStrings
的实例:
IsString
现在你可以这样说:
newtype MyData = MyData Bool deriving (Show)
instance IsString MyData where
fromString "false" = MyData False
fromString "true" = MyData True
fromString "False" = MyData False
fromString "True" = MyData True
答案 2 :(得分:0)
你根本无法做到。
首先,String
类型的值可以表示为Boolean
,如"foo"
。您的数据类型应该在MyData "foo"
上返回什么? error
?
其次,哈斯克尔哲学的一部分是:明确地做所有事情。没有类型转换,没有Foo foo = 1
在C ++中调用foo(const int&)
。这是一个很好的部分。
P.S。:如果从输入中获取值,只需自己编写一个适当的解析器(不只是Read
实例 - 它会在失败时破坏线程)。