我不理解这个新类型定义和以下代码;
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如何参与此结果?
答案 0 :(得分:4)
我如何得到这个结果?
让我们看一下如何评估它:
Prod 2 `mappend` Prod 5
收益率
Prod 10
后面的刻度只是mappend (Prod 2) (Prod 5)
由于mappend
:
Prod x `mappend` Prod y = Prod (x * y)
它针对每个参数匹配Prod
,并将它们的数字分别绑定到x
和y
。然后将这两个乘以并用于构造新的Prod
,并将其乘积作为值。
最后,为了从产品中获取结果,您必须使用getProd
,它只是展开Prod
内的值。
答案 1 :(得分:1)
Prod
本身并没有多大作用;它只是一个任意类型的包装器。但是,它的目的是作为给定Monoid
实例的基础,该实例用于乘法。
Prod x `mappend` Prod y
解析为x * y
,因为*
实例为Num
和x
提供了y
的任何定义。对getProd
的调用只是从结果中提取包装的值。