Haskell:自定义数据类型中的函数

时间:2016-06-22 21:25:02

标签: haskell custom-data-type

如果我的自定义数据类型采用Boolean的字符串表示形式(即"true""false")。如何通过数据类型将其转换为Bool而不必在输入之前执行操作?

例如

λ: MyData "false"
MyData False

3 个答案:

答案 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实例 - 它会在失败时破坏线程)。