关于Haskell中return Just 3等代码编译正确性的技术疑问
为什么
return Just 3能作为a -> Maybe a类型的函数? 要搞懂这个问题,核心是抓住两个关键点:Haskell的函数应用规则,以及函数类型的Monad实例。
先拆解语法:Haskell中函数应用优先级最高且左结合,所以
return Just 3等价于(return Just) 3,不是你可能误以为的return (Just 3)。函数类型的Monad实例:
Haskell为((->) r)(也就是接受一个r类型参数、返回某个值的函数类型)实现了Monad实例。这个Monad的return定义很直白:return x = \_ -> x说白了就是个常量函数——不管传入什么参数,它都返回
x。类型推导:
Just的类型是a -> Maybe a,把它传给函数Monad的return,得到的return Just类型就是r -> (a -> Maybe a):这是一个函数,输入任意类型的参数,输出Just函数本身。- 当你给
return Just传入3(也就是(return Just) 3),本质是调用这个常量函数,忽略参数3,直接返回Just。而Just正好符合a -> Maybe a的类型,所以f = return Just 3完全合法。
复杂例子的原理:
你写的f = return Just (Just . Just . Just . Just)本质和上面一样——return Just是个常量函数,不管你传入的是3还是多层复合的Just函数,它都会忽略参数,返回Just本身,自然也符合a -> Maybe a的类型。
内容的提问来源于stack exchange,提问作者noatbfgtxa
相关产品推荐
相关产品推荐

