gpt4 book ai didi

function - Haskell 中的组合函数

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

如何在 Haskell 中组合这些类似的函数?

getGroup [] acc = reverse acc
getGroup ((Letter x):letfs) acc = getGroup letfs ((Letter x):acc)
getGroup ((Group x):letfs) acc = getGroup letfs ((Group (makeList x)):acc)
getGroup ((Star x):letfs) acc = getGroup letfs ((Star (makeList x)):acc)
getGroup ((Plus x):letfs) acc = getGroup letfs ((Plus (makeList x)):acc)
getGroup ((Ques x):letfs) acc = getGroup letfs ((Ques (makeList x)):acc)

Letter、Group、Star、Plus 和 Ques 都是数据类型定义的一部分。

data MyData a 
= Operand a
| Letter a
| Star [RegEx a]
| Plus [RegEx a]
| Ques [RegEx a]
| Pipe [RegEx a] [RegEx a]
| Group [RegEx a]
deriving Show

由于它们的相似之处,我想知道是否有更好的方法来编写这些函数。大多数情况下,我希望将 Group、Star、Plus 和 Ques 的功能结合起来,因为它们是相同的,但如果有一种方法可以将它们全部结合起来,那就更好了。

最佳答案

如果不使用 Template Haskell,就无法摆脱模式匹配的重复,这对于只有五个不同的构造函数来说可能不值得。不过,您可以消除许多其他重复,并提高函数的性能特征。

getGroup = map go
where go (Letter x) = Letter x
go (Group x) = Group . makeList $ x
go (Star x) = Star . makeList $ x
go (Plus x) = Plus . makeList $ x
go (Ques x) = Ques . makeList $ x

除了更加简洁之外,它还消除了尾递归,尾递归会导致像 Haskell 这样的惰性语言中的空间泄漏。

关于function - Haskell 中的组合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18447256/

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