新型声明功能?

时间:2016-10-04 09:16:16

标签: haskell types

我熟悉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;参数β

1 个答案:

答案 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;功能也很好。