有人可以解释这段代码的作用吗?
Can someone explain what this bit of code does?
我知道它涉及对列表的一些递归,但我正在努力解决它添加到列表中的内容以及 x22、k 和 t 代表什么。
insertM :: Message -> [(Name, Int)] -> [(Name, Int)]
insertM (M x1 x2 m) [] = [(x2, 1)]
insertM (M x1 x2 m) ((x22,k):t) = do
if x2 == x22 then
(x22, k+1):t
else do
(x22, k): insertM (M x1 x2 m) t
这可能有帮助
data Message = M Name Name String deriving (Show)
此函数在消息列表中插入消息。如果消息已经在列表中,则增加消息计数器。
所以一行一行:
insertM (M x1 x2 m) [] = [(x2, 1)]
如果列表是 empty
并且您插入一条消息,只需输入计数为 1 的消息。
insertM (M x1 x2 m) ((x22,k):t) = do
这是第二种情况(如果你不明白,请查找模式匹配),你插入一条消息,看起来像这样 (M x1 x2 m)
到一个列表中 header (x22,k)
和尾巴 t
.
if x2 == x22 then
(x22, k+1):t
此行检查消息的 x2
部分是否与列表第一个元素的 x22
相同,并递增计数器。如果不是这种情况,请查找列表的其余部分
(x22, k): insertM (M x1 x2 m) t
(x22,k)
是列表的头部,:
附加两个列表,insertM (M x1 x2 m) t
是对尾部的递归调用,您可以在其中查找列表的其余部分。
例如:
(insertM (M "A" "B" "chicken") []) => [("B",1)]
(insertM (M "A" "B" "chicken") [("B",1)]) => [("B",2)]
(insertM (M "A" "C" "chicken") [("B",2)]) => [("B",2),("C",1)]
还有什么问题吗?
我知道它涉及对列表的一些递归,但我正在努力解决它添加到列表中的内容以及 x22、k 和 t 代表什么。
insertM :: Message -> [(Name, Int)] -> [(Name, Int)]
insertM (M x1 x2 m) [] = [(x2, 1)]
insertM (M x1 x2 m) ((x22,k):t) = do
if x2 == x22 then
(x22, k+1):t
else do
(x22, k): insertM (M x1 x2 m) t
这可能有帮助
data Message = M Name Name String deriving (Show)
此函数在消息列表中插入消息。如果消息已经在列表中,则增加消息计数器。
所以一行一行:
insertM (M x1 x2 m) [] = [(x2, 1)]
如果列表是 empty
并且您插入一条消息,只需输入计数为 1 的消息。
insertM (M x1 x2 m) ((x22,k):t) = do
这是第二种情况(如果你不明白,请查找模式匹配),你插入一条消息,看起来像这样 (M x1 x2 m)
到一个列表中 header (x22,k)
和尾巴 t
.
if x2 == x22 then
(x22, k+1):t
此行检查消息的 x2
部分是否与列表第一个元素的 x22
相同,并递增计数器。如果不是这种情况,请查找列表的其余部分
(x22, k): insertM (M x1 x2 m) t
(x22,k)
是列表的头部,:
附加两个列表,insertM (M x1 x2 m) t
是对尾部的递归调用,您可以在其中查找列表的其余部分。
例如:
(insertM (M "A" "B" "chicken") []) => [("B",1)]
(insertM (M "A" "B" "chicken") [("B",1)]) => [("B",2)]
(insertM (M "A" "C" "chicken") [("B",2)]) => [("B",2),("C",1)]
还有什么问题吗?