【发布时间】:2019-06-19 05:17:20
【问题描述】:
对于 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,()) 的正确结果
我不知道,有什么提示吗?
【问题讨论】:
-
注意表达式
if a == c then (a,d):r else (a,b):updRel r c d暗示d和b必须是同一类型。 -
哦,好吧。所以那行不通。如果没有元组构造函数(,),我还能如何更改元组的值
-
是的,对于编辑后的问题,
mult函数的类型应该是mult :: Int -> Int -> (String,())而不是(String, Int)。你想把Int值放在元组的第二个元素中是什么? -
类型已给定,无法更改。第二个参数是多重化的结果。不能说为什么,它只是需要在那里。
-
好吧,Haskell中的变量是不可变的,你不能改变它。构造
(String, Int)对的唯一方法是创建一个新的。