gpt4 book ai didi

haskell - Haskell 中 type 和 newtype 的区别

转载 作者:行者123 更新时间:2023-12-02 10:26:24 25 4
gpt4 key购买 nike

在《Programming in Haskell》(http://www.cs.nott.ac.uk/~gmh/book.html)一书中,解析器定义如下:

> type Parser a = String -> [(a,String)]

但是,从示例代码( http://www.cs.nott.ac.uk/~gmh/Parsing.lhs )来看,定义有点不同。

> newtype Parser a              =  P (String -> [(a,String)])

我发现这个页面的不同之处:https://wiki.haskell.org/Type#Type_and_newtype如下:

type introduces a synonym for a type and uses the same data constructors. newtype introduces a renaming of a type and requires you to provide new constructors.

这是我的问题:

  1. 对于新类型,为什么使用 P(...) 来包围内容?
  2. 它需要提供带有newtype的新构造函数,但我似乎没有从示例代码中找到一个。如何为newtype定义构造函数?不提供可以吗?

最佳答案

For new type why P(...) is used to enclose the content?

任何 newtype声明的类型必须有一个构造函数。在本例中,构造函数名为 P它的类型是

P :: (String -> [(a, String)]) -> Parser a

您还可以使用记录语法,因此它相当于

newtype Parser a = P { runParser :: String -> [(a, String)] }

或者如果您要使用 data类型(在这种情况下,包装器在运行时不会轻易得到优化),它会非常相似:

data Parser a = P { runParser :: String -> [(a, String)] }

It requires to provide new constructor with newtype, but I don't seem to find one from the example code. How to define constructor for newtype? Is it OK not to provide one?

如上所述,newtype Parser的构造函数名为P ,并且必须有一个 newtype 的构造函数.

更多说明,type关键字构造一个简单的别名。例如,String定义为

type String = [Char]

您可以使用String在任何需要 [Char] 的函数中,您可以使用 [Char]在任何需要 String 的函数中。自 FilePath定义为

type FilePath = String

然后你可以使用FilePath无论您在哪里使用 String因此在任何你会使用 [Char] 的地方,反之亦然。这些只是用于减少更复杂类型的名称。我想说,在实践中,使用 newtype 更常见。而不是type除了在非常简单的情况下,仅仅因为它允许类型系统在您的软件中执行更多操作。 type也有缺点s,因为您需要语言扩展才能在 instance 中使用它们声明,并且它们必须始终完全应用于其他表达式中。 newtype的缺点是你必须多次包装/展开它们,但这在处理真正复杂的程序时可能会更有好处。

关于haskell - Haskell 中 type 和 newtype 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com