首页 > 解决方案 > 如何从(String,())制作(String,Int)?

问题描述

对于 WriterMonads 的练习,我需要创建一个函数来记录它所做的事情。我不能使用元组构造函数 (,)。

我已经有一个结果类型为 (String,()) 的日志函数现在我需要使用这个但结果类型为 (String,Int)

但我不知道如何将 (String,()) 元组制作为 (String,Int)

logMsg :: String -> (String,())
logMsg  msg = (msg,()) -- Durch Lösung ersetzen.

logOp :: Int -> Int -> Int -> String -> (String,())
logOp v1 v2 res math = do
    logMsg "The value of "
    logMsg $ show v1
    logMsg  math
    logMsg $ show v2
    logMsg " is "
    logMsg $ show res
    logMsg ".\n"


mult :: Int -> Int -> (String,Int)
mult m1 m2 = logOp m1 m2 (m1*m2) "*"

我测试过

logOp m1 m2 (m1*m2) "*"

执行类型 (String,()) 的正确结果

我不知道,有什么提示吗?

标签: haskellmonads

解决方案


通常,在处理 monad 时,会使用 monadic 函数return(>>=). 您已经在您的块中(>>=)隐式使用。do

对于mult,您可以尝试使用 adoreturn在其中使用。在这种非常具体的情况下,您可以假设return定义为

return :: Int -> (String, Int)
return x = ("", x)

(在一般情况下,它是多态的return :: a -> (String, a):)


推荐阅读