我熟悉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'参数?
这似乎是一个功能声明?
是.具体来说,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"功能.
归档时间: |
|
查看次数: |
64 次 |
最近记录: |