haskell - 新类型声明函数?

标签 haskell types

我熟悉新类型声明:

newtype MyAge = Age {age :: Int} deriving (Show, Eq, Ord)

在本例中,Age 是一个 Int,但是我遇到了下面的代码,但我无法理解它:

newtype Ages a = Ages {age :: String -> [(a,String)]}

这似乎是一个函数声明? (接受字符串,返回包含“a”和字符串的元组列表)-这是正确的吗?

注意,我刚刚意识到这只是声明函数的基本记录语法。

另外,我尝试实现这种类型,但我一定做错了什么:

newtype Example a = Example {ex :: Int -> Int}

myexample = Example {ex = (\x -> x + 1)}

这可以编译,但是我不明白为什么我没有传递“a”参数?

最佳答案

This appears to be a function declaration?

是的。具体来说,String -> [(a,String)] 是一个函数类型。 newtype 声明类似于任何给定类型的简单包装器。没有任何限制表明您不能基于函数类型来制作它,并且它的工作方式完全相同。

还请记住,您总是可以将newtype替换为data;在这种情况下,将结果类型视为具有函数字段的记录类型可能会有所帮助; newtype 只是一个特殊的、优化的案例。


另一件事要提到的是,您的两条线也有所不同,因为第二条线是通过 a 进行参数化的。这当然可以与常规类型一起使用:

newtype MyWrapper a = MyWrapper a

或者函数类型可以是newtype-d,无需参数化

newtype MyFunction = MyFunction (Float -> Float)

您还可以使用记录语法编写上述内容,该语法也为您提供“getter”函数。

关于haskell - 新类型声明函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39848495/

相关文章:

haskell - Haskell 或函数式语言的代理?

haskell - -XStrict 在 GHC 中有什么作用吗?

c++ - 在 C++ 中确定模板类型的取值范围

c# - 与类实例具有相同类型的成员

使用 malloc() 创建数据类型

c - 2 的整数次幂的二进制表示

Haskell 对(位 a)推断类型错误的困惑

haskell - 类型模式的名称 : R a b = Q (a -> (R a b, b))

Javascript 字符串到数字类型强制

haskell - 有没有更原始、更实用的 Haskell 网络框架?