新型声明功能?

Bab*_*ham 2 haskell types

我熟悉newtype声明:

newtype MyAge = Age {age :: Int} deriving (Show, Eq, Ord)
Run Code Online (Sandbox Code Playgroud)

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

newtype Ages a = Ages {age :: String -> [(a,String)]}
Run Code Online (Sandbox Code Playgroud)

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

NB我刚刚意识到这只是声明一个函数的基本记录语法.

另外,我试图实现这种类型,但我必须做错事:

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

myexample = Example {ex = (\x -> x + 1)}
Run Code Online (Sandbox Code Playgroud)

这编译,但我不明白为什么因为我没有通过'a'参数?

Bar*_*icz 5

这似乎是一个功能声明?

是.具体来说,String -> [(a,String)]是一种功能类型.一个newtype声明类似于围绕任何给定类型的简单包装.没有任何限制表示你不能基于函数类型来创建它,它的工作方式完全相同.

还记得您可以随时更换newtype使用data; 在这种情况下,将结果类型视为具有函数字段的记录类型可能会有所帮助; newtype只是一个特殊的优化案例.


另外要提一下的是,你的两条线也有所不同,第二条线是参数化的a.这当然可以与常规类型一起使用:

newtype MyWrapper a = MyWrapper a
Run Code Online (Sandbox Code Playgroud)

或者函数类型可以是newtype-d而不进行参数化

newtype MyFunction = MyFunction (Float -> Float)
Run Code Online (Sandbox Code Playgroud)

您也可以使用记录语法编写上述内容,该语法也为您提供"getter"功能.