Haskell newtype定义

时间:2018-01-29 16:42:26

标签: haskell functional-programming

我不理解这个新类型定义和以下代码;

newtype Prod a =  Prod { getProd :: a }  

instance Num a => Monoid (Prod a) where  
    mempty = Prod 1  
    Prod x `mappend` Prod y = Prod (x * y)  

然后我运行以下查询:

Ghci > getProd $ Prod 2 `mappend` Prod 5  
    -> 10

如何获得此结果以及getProd如何参与此结果?

2 个答案:

答案 0 :(得分:4)

  

我如何得到这个结果?

让我们看一下如何评估它:

Prod 2 `mappend` Prod 5

收益率

Prod 10

后面的刻度只是mappend (Prod 2) (Prod 5)

的糖

由于mappend

的定义,这是有道理的
Prod x `mappend` Prod y = Prod (x * y)  

它针对每个参数匹配Prod,并将它们的数字分别绑定到xy。然后将这两个乘以并用于构造新的Prod,并将其乘积作为值。

最后,为了从产品中获取结果,您必须使用getProd,它只是展开Prod内的值。

答案 1 :(得分:1)

Prod本身并没有多大作用;它只是一个任意类型的包装器。但是,它的目的是作为给定Monoid实例的基础,该实例用于乘法。

Prod x `mappend` Prod y解析为x * y,因为*实例为Numx提供了y的任何定义。对getProd的调用只是从结果中提取包装的值。