Haskell中如何在Data.Sequence.mapWithIndex回调内访问外部xs列表
解决方法
你可以通过闭包或者显式传参+偏函数应用的方式把xs传递到checkPrefix内部,两种常用实现方式如下:
方式1:将checkPrefix定义在prefixRule的作用域内
直接把checkPrefix写在prefixRule的where子句中,它可以直接访问外层作用域的xs变量,不需要修改原有调用逻辑:
prefixRule :: [LocalType] -> IO () prefixRule sequent = do let newlist = S.mapWithIndex checkPrefix (S.fromList xs) -- 定义在prefixRule内部,可直接访问外层的xs checkPrefix :: Int -> LocalType -> LocalType checkPrefix index (Act dir s lt) = do -- 此处直接使用xs即可 ... ...
方式2:给checkPrefix新增xs参数,通过偏应用传入
如果你需要在其他地方复用checkPrefix,可以给它新增一个接收xs的参数,调用时先传入xs生成符合mapWithIndex参数要求的函数:
-- 新增第一个参数接收xs列表 checkPrefix :: [LocalType] -> Int -> LocalType -> LocalType checkPrefix xs index (Act dir s lt) = do -- 此处即可访问传入的xs ... prefixRule :: [LocalType] -> IO() prefixRule sequent = do -- 先传入xs,得到类型为 Int -> LocalType -> LocalType 的函数,适配mapWithIndex的入参要求 let newlist = S.mapWithIndex (checkPrefix xs) (S.fromList xs) ...
额外注意:你提供的代码存在两处拼写不一致的问题,一是
checkPrefix里的类型是LocalType,但prefixRule的参数签名里写的是Localtype,二是代码中S.fromList xs的xs看起来应该是你传入的sequent参数,注意统一拼写避免编译报错。
内容的提问来源于stack exchange,提问作者Polo
相关产品推荐
相关产品推荐

