应用运算符 <* 和 *>,类型签名暗示

互联网 行业动态 更新时间:2024-06-13 00:19:06

Wil*_*ess 9

(*>) :: f a -> f b -> f b
(<*) :: f a -> f b -> f a

这些类型签名是否真的暗示了上面显示的行为?

当然不是。这两个操作可以简单地实现为

apR :: (Applicative f) => f a -> f b -> f b
apR a b = b

apL :: (Applicative f) => f a -> f b -> f a
apL a b = a

只是忽略Applicative.f

并且以同样的方式[a] -> Int并不意味着实现是length. 它也可以是

foo :: [a] -> Int
foo _ = 42

但是在这两种情况下,这些都不是“正确”的实现,因为推断的类型与给定的签名不同。

那么,您的问题可能有点不同,例如,假设有一个具有匹配推断类型的实现。这是否意味着它做了我们想要做的事情?

答案似乎仍然是否定的。一方面,我们可以定义

apR2 :: (Applicative f) => f a -> f b -> f b
apR2 a b = pure (\a _ b -> b) <*> a <*> b <*> b

对于某些类型,例如您的示例,它不会有所作为。但总的来说,做两次效果与只做一次是不同的。

另一个更有意义的“错误”实现(感谢Daniel Wagner的评论)是

apR2b :: (Applicative f) => f a -> f b -> f b
apR2b a b = pure (\b a -> b) <*> b <*> a

现在,即使您的示例也并不总是有效,因为效果的顺序不同——它首先“做” b's,在a's 之前。

不仅有效果完成的次数,还有顺序。例如,`foo fa fb = pure const &lt;*&gt; fb &lt;*&gt; fa` 也具有与 `(*&gt;)` 相同的推断类型,只执行一次所有效果,并且仍然与它有明显的不同。 (2认同)

更多推荐

暗示,运算符,类型,lt,amp

本文发布于:2023-04-20 20:48:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/0e3d70c6d90b6ef1f77a8c98cb6667ef.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:暗示   运算符   类型   lt   amp

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!