[英]Haskell: functions in custom data types
如果我有一个采用Boolean
的字符串表示形式的自定义数据类型(即"true"
或"false"
)。 如何通过数据类型将其转换为Bool
,而无需之前对输入执行任何操作?
例如
λ: MyData "false"
MyData False
您不能没有函数,通常只需定义一个返回新类型的函数即可,例如:
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"
。
您还可以在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
现在您可以说:
> "false" :: MyData
MyData False
> "True" :: MyData
MyData True
你根本做不到。
首先, String
类型具有不可表示为Boolean
,例如"foo"
。 您的数据类型应该在MyData "foo"
上返回什么? 一个error
?
第二,haskell哲学的一部分:明确地做所有事情。 没有类型转换,没有Foo foo = 1
像C ++中那样调用foo(const int&)
。 这是一个很好的部分。
PS:如果您从输入中获取值,则只需为自己编写一个适当的解析器即可(不只是Read
实例,它会在失败时破坏线程)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.