2016-10-04 129 views
2

我熟悉的NEWTYPE声明:新类型声明函数?

newtype MyAge = Age {age :: Int} deriving (Show, Eq, Ord) 

在这种情况下年龄是int,但是我遇到下面的代码,我无法理解这一点:

newtype Ages a = Ages {age :: String -> [(a,String)]} 

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

N.B我刚刚意识到这只是声明函数的基本记录语法。

此外,我试图实现这种类型的,但我必须做一些错误:

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

myexample = Example {ex = (\x -> x + 1)} 

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

+1

不要将新问题添加到现有帖子。也就是说,'Example a'是使用[phantom type](https://wiki.haskell.org/Phantom_type)的一个例子。 – chepner

回答

5

这似乎是一个函数声明?

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

还记得你可以总是替换newtypedata;在这种情况下,将结果类型考虑为具有作为函数的字段的记录类型可能会有所帮助; newtype只是一个特殊的优化案例。其他


有一点要提的是,你的两条线路也是不同的是,第二个是参数化了a。当然,这可以用常规的类型一起使用:

newtype MyWrapper a = MyWrapper a 

或函数的类型可以是newtype -d没有参数化

newtype MyFunction = MyFunction (Float -> Float) 

你也可以写上使用记录语法,让你的“吸气剂“功能。

+0

如何将此新类型声明更改为正常函数声明? –

+0

@barbrac你是指函数声明还是常规类型别名?如果是后者,只需使用'type'。 –

+0

@barbrac这就是问题应该从一开始看起来的样子。请避免进行大幅度改变Q/A范围的编辑。 –