gpt4 book ai didi

haskell - 重用多个值构造函数模式匹配时避免重复代码

转载 作者:行者123 更新时间:2023-12-02 14:12:05 24 4
gpt4 key购买 nike

假设您有一个具有多个值构造函数的数据结构,例如如下所示的 LogMessage 数据结构:

data LogMessage = Unknown String 
| LogMessage MessageType TimeStamp String

如果消息可以被正确解析,它会包含一些额外的数据,然后是一个String。如果无法解析,那么它只是一个包罗万象的未知字符串

或者假设您正在使用诸如Either String String之类的东西,因此您可能正在处理Left StringRight String >.

现在假设您希望对基础数据应用相同的处理步骤,无论它驻留在哪个值构造函数中。

例如,我可能想检测 LogMessage 字符串中的某个单词,因此我可以有一个如下所示的函数:

detectWord :: String -> LogMessage -> Bool
detectWord s (Unknown m) = isInfixOf s (map toLower m)
detectWord s (LogMessage _ _ m) = isInfixOf s (map toLower m)

或者可以轻松地编写它来处理Either String String作为输入,而不是LogMessage

在这两种情况下,我都必须重复完全相同的代码(isInfixOf ... 部分),因为我必须提取底层数据,由于不同的模式匹配,它将以不同的方式进行操作。值构造函数。

必须为每个不同的值构造函数匹配重复/“复制粘贴”代码,这是很糟糕的。

如何在不复制/粘贴代码的情况下编写这些类型的 Haskell 函数?如何只编写一次底层逻辑,然后解释如何在许多不同的值构造函数模式中使用它?

简单地将其移动到辅助辅助函数会减少字符数,但并不能真正解决问题。例如,下面的想法在“不要重复自己”方面并没有比第一种情况更好:

helper :: String -> String -> Bool
helper s m = isInfixOf s (map toLower m)

detectWord :: String -> LogMessage -> Bool
detectWord s (Unknown m) = helper s m
detectWord s (LogMessage _ _ m) = helper s m

我们再次必须对每种不同的模式说同样的话。

最佳答案

编写一个在任一情况下获取消息的函数。然后,您不需要为不关心的用途编写单独的案例:

getMsg (Unknown m) = m
getMsg (LogMessage _ _ m) = m

detectWord s log = infixOf s (map toLower (getMsg log))

请注意,某些东西必须检查您类型的大小写,而getMsg大约是按照这些方式进行的最小操作。

关于haskell - 重用多个值构造函数模式匹配时避免重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35256473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com