Haskell新类型定义

Ger*_*Nab 1 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)  
Run Code Online (Sandbox Code Playgroud)

然后我运行以下查询:

Ghci > getProd $ Prod 2 `mappend` Prod 5  
    -> 10
Run Code Online (Sandbox Code Playgroud)

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

Nei*_*etz 5

我如何得到这个结果?

让我们看一下如何评估:

Prod 2 `mappend` Prod 5
Run Code Online (Sandbox Code Playgroud)

产量

Prod 10
Run Code Online (Sandbox Code Playgroud)

背tick只是糖 mappend (Prod 2) (Prod 5)

这是有道理的,因为定义为mappend

Prod x `mappend` Prod y = Prod (x * y)  
Run Code Online (Sandbox Code Playgroud)

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

最后,为了从产品中获得结果,您必须使用getProd,这只是将值包装在内Prod