我熟悉新类型声明:
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/