Haskell中Parser类型<$>运算符的两种实现写法是否存在差异?
两种Parser <$>实现的差异说明
核心结论
两种写法没有任何功能、运行效果层面的差异,仅为Haskell语法层面的不同写法,行为完全等价。
具体解释
Haskell默认采用柯里化的函数定义规则,多参数函数本质上都是「接收单个参数、返回接收下一个参数的函数」的嵌套结构:
- 第一种写法是将运算符的三个逻辑参数
f、p1、s都显式声明在等号左侧,属于最直观的多参数函数定义写法 - 第二种写法是显式体现了柯里化的结构:运算符仅接收
f和p1两个参数后,就返回一个接收输入状态s的匿名函数,和第一种写法的柯里化展开结果完全一致
代码对比
两种写法的签名完全一致,逻辑分支也完全相同:
第一种实现:
(<$>) :: (a -> b) -> Parser a -> Parser b (<$>) f p1 s = case p1 s of Just (r1 , s') -> Just (f r1, s') Nothing -> Nothing
第二种实现:
(<$>) :: (a -> b) -> Parser a -> Parser b f <$> p1 = \s -> case p1 s of Just (r1 , s') -> Just (f r1, s') Nothing -> Nothing
在标准Haskell编译器(如GHC)的默认编译选项下,两段代码生成的执行逻辑、性能表现、返回结果没有任何区别。只有在开启了特殊的严格性注解、或者非标准的方言扩展时,才有可能出现可观测的差异,这种极端场景通常不在常规开发的考虑范围内。
内容的提问来源于stack exchange,提问作者Jonathan Layduhur
相关产品推荐
相关产品推荐

