杂质会影响操作的关联性吗?

Can impurity affect the associativity of an operation?

提问人: 提问时间:10/29/2020 更新时间:10/29/2020 访问量:49

问:

关联性是一个理想的属性,在 FP 中的许多操作中很常见。现在我想知道一个不纯的功能是否会干扰它。我发现的唯一例子并不真正令人信服,因为我不确定空函数是否算作正确的函数(严格来说),此外,这个例子看起来相当做作。

以下内容是用 JS 编写的,但希望是不言自明的:

// function composition
const comp = f => g => x => f(g(x));

const foo = () => 1;
const bar = () => Math.round(Math.random() * 100);

// Set functor (ignore the hideous implementation)
const map = f => s => {
  const r = new Set();
  s.forEach(x => r.add(f(x)));
  return r;
};

const lhs = map(comp(bar) (foo));
const rhs = comp(map(bar)) (map(foo));

const set1 = lhs(new Set([1, 2, 3]));
const set2 = rhs(new Set([1, 2, 3]));

console.log(Array.from(set1)); // yields an array filled with up to three random integers
console.log(Array.from(set2)); // yields an array filled with a single random integer

我不确定这个例子是否可以被视为证据。有没有更令人信服的例子?

函数式编程 语言不可知 副作用 关联性 纯度

评论

0赞 Guy Coder 10/29/2020
我认为具有范畴理论和计算机科学背景的人将能够轻松回答这个问题。也许你应该把问题转移到数学计算机科学上。我的猜测是肯定的,但我希望看到一个证据,这超出了我的技能范围。
0赞 10/30/2020
我试图想出另一个例子或在网上找到一个,但没有任何结果。这两个属性之间可能没有任何关系。
1赞 Guy Coder 10/30/2020
我认为可以使用异常或副作用(例如打印到终端)作为示例。从多任务代码打印调试消息时,消息的顺序应按时间顺序排列,但有时它们按任务分组,并且不按时间顺序排列。
0赞 10/30/2020
同意,我猜。不过,我仍然有点困惑。竞争条件也发生在 Javascropt 事件循环中 - 在异步计算的上下文中。我认为突变作为一类副作用会引起竞争条件,并使更多功能变得非幂等。但它们不会直接干扰关联性/交换性。

答: 暂无答案