为什么限制新类型?

时间:2016-04-23 14:34:51

标签: haskell

我读到“newtype只有一个构造函数,里面只有一个字段。”这种限制是否会增加任何优势?如果值构造函数仅限于一个字段,为什么我不能直接在我的代码中使用该字段,而不是用newtype包装它?

1 个答案:

答案 0 :(得分:1)

newtype是一个用于创建没有运行时成本的数据抽象的工具。

抽象是什么意思?

假设你有:

greetPerson :: String -> String -> String
greetPerson greeting name = greeting ++ " " ++ name

greetPerson "Hello" "Mike" => "Hello Mike"

这样可以正常使用,但它会为误用提供机会:

greetPerson "Mike" "Hello" => "Mike Hello"

问题是你在任何地方使用相同的类型(String),没有语义含义。让我们使用一个新类型:

newtype Name = Name String

greetPerson :: String -> Name -> String
greetPerson greeting (Name name) = greeting ++ " " ++ name

greetPerson "Hello" (Name "Mike") => "Hello Mike"

我们最终得到了相同的功能,但现在类型签名具有更多意义,编译器可以告诉我们何时滥用它。

没有运行时成本是什么意思?

我的示例中的newtype仅存在于类型级别,编译器生成完全相同的代码,就像我在整个过程中使用String一样。

这暗示了为什么newtype仅允许一个具有一个字段的构造函数。

想象一下,您试图使newtype适用于多个构造函数。你如何区分运行时的那个?您必须存储一些其他信息。

与多个字段相同。你需要一些方法将两个字段捆绑在一起。

所有这些都会增加newtype承诺不会执行的运行时成本。

如果您想要多个字段或多个构造函数,只需使用data

data Foo = Bar String | Baz Int Bool