我熟悉newtype声明:
public void addDisk(Disk disk){
Singer singer = disk.getSinger();
List<Disk> discography = null;
if(diskMap.get(singer) == null){
diskMap.put(singer, new ArrayList<Disk>());
}
discography = diskMap.get(singer);
discography.add(disk);
}
在这种情况下,Age是一个Int,但是我已经遇到过以下代码,我无法理解它:
newtype MyAge = Age {age :: Int} deriving (Show, Eq, Ord)
这似乎是一个功能声明? (接受字符串,返回包含&#39; a&#39;和字符串)的元组列表 - 这是正确的吗?
N.B我刚刚意识到这只是声明一个函数的基本记录语法。
另外,我已尝试实施此类型,但我必须做错事:
newtype Ages a = Ages {age :: String -> [(a,String)]}
这编译,但是我不明白为什么我没有通过&#39; a&#39;参数β
答案 0 :(得分:5)
这似乎是一个功能声明?
是。具体来说,String -> [(a,String)]
是一种函数类型。 newtype
声明类似于任何给定类型的简单包装。没有任何限制,表示您无法根据功能类型制作它,并且它的工作方式完全相同。
另请注意,您可以始终将newtype
替换为data
;在这种情况下,将结果类型视为具有函数字段的记录类型可能会有所帮助; newtype
只是一个特殊的优化案例。
还有一点要提到的是,你的两条线也不同,第二条线在a
上进行了参数化。这当然可以与常规类型一起使用:
newtype MyWrapper a = MyWrapper a
或函数类型可以是newtype
- d没有参数化
newtype MyFunction = MyFunction (Float -> Float)
您也可以使用记录语法编写上述内容,为您提供&#34; getter&#34;功能也很好。