有效的应用程序编程中效果的概念是什么意思?
例如,下面表达式的哪些部分是效果?
[(+1)] <*> [2,3]
Just (+1) <*> Nothing
最佳答案
不幸的名称选择引起了很多困惑,这在 Haskell 中很常见(想想“return
”,更好地命名为“emit
”)。pure x
不纯,是x
那是纯粹的,pure
只是注入(inject)。它是 envisioned to be used in pure f <*> a <*> b <*> ...
模式,让我们有效地应用纯函数 f
.(1)[]
applicative(2) 让我们“非确定性地”将( <*>
,而不是 $
)非确定性值(在您的示例中不是两个值)应用于非确定性函数;非确定性就是效果。(3)
在应用程序列表中,[(+1), (+2)]
是一个非确定性函数,它可能将一个值增加 1,也可能将其增加 2。[3,4,5]
是一个非确定性值,其可能值如所列。就像我们应用普通实体 (+1)
和 3
通常,使用 (+1) $ 3
,所以我们可以用 [(+1)] <*> [3]
不确定地应用非确定性值吗?或 [(+1),(+2)] <*> [3,4,5]
.
和 Maybe
失败的可能性就是效果。
(1) 正如论文在引言中所说:“我们收集一些有效计算的值,然后将其用作纯函数 (:)
的参数”
(2) []
本身不是应用程序,([], pure :: a -> [a], (<*>) :: [a -> b] -> [a] -> [b])
是一个应用程序,给定 pure
的一些(合法)实现和 (<*>)
.对于[]
仿函数,有两种可能性:标准[]
的外积类。 Applicative
实例,以及 ZipList
的内积之一的。
(3) x
是纯的(如“Haskell 是纯的”); pure x
代表有效计算产生x
实际上没有任何额外的效果。 “没有效果”是指pure x *> u == u
的法律。即pure x
不会在 u
之上的组合计算中添加任何效果的贡献。但是效果的可能性是存在的。 (一个例子是幂等的副作用,例如触发文件系统中某个文件的存在:pure ()
本身也会执行此效果;(pure id <*>) == id
仍然有效,应该如此。)pure 7 :: IO Int
肯定不是纯的(如“Haskell 是纯的”)值 7
,是纯值7
在有效的上下文中(此处为 IO
)。即使它在该上下文中没有实际操作,它仍然在该上下文中(IO
)。
另一方面,与 pure
的目的无关,当然任何 Haskell 值都是“纯的”,即引用透明。 getLine
是一个纯粹的、引用透明的 Haskell 值。它代表/表示有效的 I/O 计算,从用户那里获取输入行并将其生成为链中下一个 I/O 计算使用的结果。print 7
是一个纯参照透明的 Haskell 值。这不是这里所说的一种“纯粹”。 [1,2]
是一个纯值,但从另一个角度来看,由 []
解释<*> / pure
的实现,它被视为具有两个可能的纯值的不确定值 1
和 2
. [1] = pure 1
相同.它仍然可以解释为具有一个可能的纯值 1
的不确定值。 .[1,2] *> [10,20]
= [10,20,10,20]
; [1] *> [10,20]
= [10,20]
.所以不像 [1,2]
, [1]
不会在 [10,20]
描述/表示的非确定性计算中添加更多的不确定性(根据标准 []
Applicative
实现)。但它仍然是一个不确定的值。可以参加*>
, 不像 1
不能。
我们通过它可以参与的各种交互来了解一种类型。
也可以看看:
关于haskell - 什么是应用效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25837453/