Open boboyada opened 7 years ago
可以呀,我们拿Maybe
为例:
-- (<*)的默认实现
(<*) :: f a -> f b -> f a
(<*) = liftA2 const -- \ x y -> const <$> x <*> y
-- 对于Maybe来说
f <$> (Just x) = Just f x
f <$> Nothing = Nothing
(Just f) <*> (Just x) = Just f x
_ <*> _ = Nothing
Nothing <* Just 3 -- const <$> Nothing <*> Just 3 -- Nothing
Just 3 <* Nothing -- const <$> Just 3 <*> Nothing -- Just (const 3) <*> Nothing -- Nothing
[]
的类似,都是把定义代入,读者自己拿出纸笔划划就会发现很显而易见😄
很奇妙!清楚了一点。 [1..2] <* [1..10] --[1111111111,2222222222] 但 []还是请你也一并推导一遍
[],Maybe作为Functor,Applicative,Monad,的实例,应该也有自己的实现。源代码怎么看?
你先去hackage上查看base的文档(里面有源码的链接),自己推试试,不行我再来给你推个。
136页的定义
(<*) = flip (*>)
是不是不太对?
按这个定义137页的
[1,2] <* [1..10]
结果是
[1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2]
是的,确实不是简单的flip,effect的展开是有顺序的,感谢反馈。
P137页第二段: 需要注意的是,很多新手会误认为(< ) :: f a -> f b -> f a 和const函数一样,就直接忽略第二个参数。。。。。。。。。。。。。 Nothing < Just 3 --Nothing
Just <* Nothing --Nothing
[1..2] <* [1..10] --[1111111111,2222222222] 能推导这个过程吗?为什么?