繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM