gpt4 book ai didi

haskell - 有没有办法在仍然编写类型签名的同时指定隐式参数的递归行为?

转载 作者:行者123 更新时间:2023-12-04 11:35:01 25 4
gpt4 key购买 nike

根据 GHC 用户指南,显式绑定(bind)的隐式参数仅在函数具有类型签名的情况下才会传播到递归调用中,否则,将使用来自原始调用的隐式参数。

fu True = ?gn
fu False = let ?gn = not ?gn in fu True
br :: (?sp :: Bool) => Bool -> Bool
br True = ?sp
br False = let ?sp = not ?sp in br True
ghci> let ?gn = True in fu False
True
ghci> let ?sp = True in br False
False
但是,如果我想为 fu 提供类型签名怎么办?同时保留其行为?我可以这样做吗?

最佳答案

您可以进行“worker-wrapper”转换:获取函数的递归部分并将其移动到本地绑定(bind)中。这使您可以明确隐式参数,因此递归调用没有歧义。

fu :: (?gn :: Bool) => Bool -> Bool
fu = go ?gn
where
go gn True = gn
go gn False = go (not gn) True
反正我个人觉得这个版本更容易理解。

关于haskell - 有没有办法在仍然编写类型签名的同时指定隐式参数的递归行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68258270/

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