haskell - 什么是应用效果?

标签 haskell applicative

有效的应用程序编程中效果的概念是什么意思?

例如,下面表达式的哪些部分是效果?

[(+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的实现,它被视为具有两个可能的纯值的不确定值 12 . [1] = pure 1 相同.它仍然可以解释为具有一个可能的纯值 1 的不确定值。 .[1,2] *> [10,20] = [10,20,10,20] ; [1] *> [10,20] = [10,20] .所以不像 [1,2] , [1]不会在 [10,20] 描述/表示的非确定性计算中添加更多的不确定性(根据标准 [] Applicative 实现)。但它仍然是一个不确定的值。可以参加*> , 不像 1不能。
我们通过它可以参与的各种交互来了解一种类型。
也可以看看:

  • values and computations
  • 关于haskell - 什么是应用效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25837453/

    相关文章:

    scala - 如何 flatMap cats Applicatives

    haskell - 我可以制作带有 Monad 约束的 Lens 吗?

    perl - Perl 5 中惰性求值技术的例子?

    haskell - 如何为自定义新类型派生 PersistField?

    haskell - 列表上的应用仿函数

    haskell - 为什么 <$> 和 <*> 以与 >>= 相反的顺序接受输入?

    clojure - 有没有办法逐步显示Clojure如何评估功能?

    exception - Haskell中的非一元错误处理?

    haskell - 在 Hackage 上寻找反向依赖

    haskell - 就地多态快速排序中的 STUArray 类型参数