haskell *> 排序运算符
haskell *> sequencing operator
我对我的问题的回答有一个问题:
我的代码发布在那里。
它涉及使用 *>
排序运算符而不是 <*>
应用运算符。
根据 https://hackage.haskell.org/package/base-4.15.0.0/docs/Control-Applicative.html#v:-42--62- 的解释,我了解到 *>
序列操作,丢弃第一个参数的值。因此,对于我的代码,我尝试了 fail6 = fail2 *> success
,它可以工作,但它不应该工作,因为第一个参数的值,即 fail2,应该被丢弃。为什么 fail6
有效?
fail6
的输出是Failure [MooglesChewedWires,Whosebug]
。
discard the result是指一个applicative的结果。所以对于 Either
这意味着 Right y
。 (*>)
因此等同于:
(*>) :: Applicative f => f a -> f b -> f b
(*>) f g = liftA2 (const id) f g
或另一种形式:
(*>) :: Applicative f => f a -> f b -> f b
(*>) f g = (const id) <$> f <*> g
它因此运行了两个操作,return 是第二个结果,但这是在“Applicative
上下文中”。
例如,对于 Either
,实现为:
instance Applicative (Either a) where
pure = Right
Left e <*> _ = Left e
_ <*> Left e = Left e
Right f <*> Right x = Right (f x)
这意味着 (*>)
是为 Either
实现的:
-- (*>) for Either
(*>) :: Either a b -> Either a c -> Either a c
Left x *> _ = Left x
_ *> Left x = Left x
Right _ *> Right x = Right x
或同等学历:
-- (*>) for Either
(*>) :: Either a b -> Either a c -> Either a c
Left x *> _ = Left x
_ *> x = x
如果第一个操作数是Right …
,它将return第二个操作数,如果第一个操作数是Left x
,它将return[=23] =].
“结果”是一个相当模糊的术语,不是吗?当我们谈论 Functor
、Applicative
和 Monad
时,我们倾向于在某种“上下文”中指代零个或多个值。所以
IO a
:一个I/O计算产生一个a
. 类型的值
[a]
:a
. 类型的零个或多个值的列表
Maybe a
: a
. 类型的零个或一个元素
Either e a
:就像 Maybe a
一样,除了没有 a
的情况是用 e
. 类型的东西“装饰”的
(x, a)
:a
类型的值用 x
. 类型之一“修饰”
Identity a
: a
类型的值,没有任何上下文。
当您“丢弃结果”时,这意味着您关心 上下文 但不关心 值。所以:
- I/O做了什么?
- 列表有多少个元素?
- 值
Just
是什么还是 Nothing
?
- 值
Right
是什么还是 Left e
?
- 装修是什么?
- 没有信息。
我对我的问题的回答有一个问题:
我的代码发布在那里。
它涉及使用 *>
排序运算符而不是 <*>
应用运算符。
根据 https://hackage.haskell.org/package/base-4.15.0.0/docs/Control-Applicative.html#v:-42--62- 的解释,我了解到 *>
序列操作,丢弃第一个参数的值。因此,对于我的代码,我尝试了 fail6 = fail2 *> success
,它可以工作,但它不应该工作,因为第一个参数的值,即 fail2,应该被丢弃。为什么 fail6
有效?
fail6
的输出是Failure [MooglesChewedWires,Whosebug]
。
discard the result是指一个applicative的结果。所以对于 Either
这意味着 Right y
。 (*>)
因此等同于:
(*>) :: Applicative f => f a -> f b -> f b
(*>) f g = liftA2 (const id) f g
或另一种形式:
(*>) :: Applicative f => f a -> f b -> f b
(*>) f g = (const id) <$> f <*> g
它因此运行了两个操作,return 是第二个结果,但这是在“Applicative
上下文中”。
例如,对于 Either
,实现为:
instance Applicative (Either a) where pure = Right Left e <*> _ = Left e _ <*> Left e = Left e Right f <*> Right x = Right (f x)
这意味着 (*>)
是为 Either
实现的:
-- (*>) for Either
(*>) :: Either a b -> Either a c -> Either a c
Left x *> _ = Left x
_ *> Left x = Left x
Right _ *> Right x = Right x
或同等学历:
-- (*>) for Either
(*>) :: Either a b -> Either a c -> Either a c
Left x *> _ = Left x
_ *> x = x
如果第一个操作数是Right …
,它将return第二个操作数,如果第一个操作数是Left x
,它将return[=23] =].
“结果”是一个相当模糊的术语,不是吗?当我们谈论 Functor
、Applicative
和 Monad
时,我们倾向于在某种“上下文”中指代零个或多个值。所以
IO a
:一个I/O计算产生一个a
. 类型的值
[a]
:a
. 类型的零个或多个值的列表
Maybe a
:a
. 类型的零个或一个元素
Either e a
:就像Maybe a
一样,除了没有a
的情况是用e
. 类型的东西“装饰”的
(x, a)
:a
类型的值用x
. 类型之一“修饰”
Identity a
:a
类型的值,没有任何上下文。
当您“丢弃结果”时,这意味着您关心 上下文 但不关心 值。所以:
- I/O做了什么?
- 列表有多少个元素?
- 值
Just
是什么还是Nothing
? - 值
Right
是什么还是Left e
? - 装修是什么?
- 没有信息。