gpt4 book ai didi

haskell - 我怎样才能把它写成隐式递归?

转载 作者:行者123 更新时间:2023-12-02 17:01:37 26 4
gpt4 key购买 nike

我正在尝试编写一个模块,该模块可以采用简单方程的字符串表示形式,并对其进行评估。第一步,我需要将方程分割成单独的标记;基于takePiece的“规则”。我尝试将 cutEqu 写为折叠,但遇到了一个问题:我并没有真正折叠字符串;我会取不同大小的碎片,直到用完为止。我可以作弊并使其折叠等于字符串长度的数字列表,但这看起来很笨拙。

在我读过的大多数指南中,他们指出,一旦您了解隐式递归模式(例如折叠和映射),显式递归就很少发生,这似乎是一种潜在的常见情况,但找不到适当的标准函数来处理它。有人会如何使用隐式递归编写像 cutEqu 这样简单的东西?我确信我可以找出一个简单的函数来封装该行为,但它尚未存在于标准库中,这表明我可能正在考虑错误的场景。

import Data.Char

isLit :: String -> Bool
isLit = isDigit . head

takePiece :: String -> (String,String)
takePiece str
| isLit str = break (not . isDigit) str
| otherwise = splitAt 1 str

cutEqu :: String -> [String]
cutEqu [] = []
cutEqu xs = let (p,rest) = takePiece xs in
p : cutEqu rest

编辑:这是我隐式编写它的尝试:

consumeWith :: ([a] -> ([b],[a])) -> [a] -> [[b]]
consumeWith _ [] = []
consumeWith f xs = let (t, rest) = f xs in
t : consumeWith f rest

cutEqu' :: String -> [String]
cutEqu' = consumeWith (takePiece)

但是,我再次担心这样的东西不是标准函数。有没有更好的方法来解决这个问题?

最佳答案

该模式称为 unfoldr ,其类型签名为:

unfoldr :: (b -> Maybe (a, b)) -> b -> [a]

您的 cutEq 函数可以用 unfoldr 编写,如下所示:

import Data.List

cutEq' str = unfoldr go str
where go [] = Nothing
go xs = Just $ takePiece xs

关于haskell - 我怎样才能把它写成隐式递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26893108/

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