haskell - 如何从(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,()) 的正确结果
我不知道,有什么提示吗?
解决方案
通常,在处理 monad 时,会使用 monadic 函数return
和(>>=)
. 您已经在您的块中(>>=)
隐式使用。do
对于mult
,您可以尝试使用 ado
并return
在其中使用。在这种非常具体的情况下,您可以假设return
定义为
return :: Int -> (String, Int)
return x = ("", x)
(在一般情况下,它是多态的return :: a -> (String, a)
:)
推荐阅读
- scala - scala中有什么方法可以返回一个类型吗?
- validation - @get:NotNull 在 Kotlin 中是什么意思?
- python - 如何模糊面部不使用opencv?
- ffmpeg - ffmpeg - libx264 + 幻灯片产生拖尾输出
- python - pyplot - iloc 在这段代码片段中做了什么
- laravel - 从 laravel 雄辩的关系中获取最大计数
- javascript - 计算数组中的重复元素:Javascript
- reactjs - 为什么从 Bluehost 连接到 Firebase 的自定义域不起作用?
- neural-network - BCEWithLogitsLoss:试图将预测标签的二进制输出作为张量,与输出层混淆
- c++ - 在c++中声明char变量,为什么需要加1来声明数组大小