关于表达式reverse (span p (reverse l))的类型检查与spanEnd定义疑问
关于GHC.Utils.Misc中spanEnd函数文档的疑问解答
首先明确:标准Haskell里没有能直接接收元组参数的reverse函数,文档里的表达式是语义层面的简写,并非严格可编译的Haskell代码。
你提到的类型错误确实存在——span p (reverse l)返回的是([a], [a])元组,而标准reverse的类型是[a] -> [a],根本无法作用在元组上。
文档里的写法是为了直观表达spanEnd的语义:
span是把列表从左到右拆分出最长的满足条件的前缀;spanEnd是把列表从右到左拆分出最长的满足条件的后缀;
所以用“反转列表→用span拆分→把拆分结果再反转回来”来描述,但这里的“反转回来”不是直接对元组调用reverse,而是要对元组的两个元素分别反转,再交换顺序。
正确的等价Haskell代码应该是:
spanEnd p l = let (prefixRev, suffixRev) = span p (reverse l) in (reverse suffixRev, reverse prefixRev)
简单说,文档里的写法是简化的语义描述,不是可直接运行的代码,不用纠结字面意思的类型问题。
内容的提问来源于stack exchange,提问作者F. Zer
相关产品推荐
相关产品推荐

