【发布时间】:2023-03-18 12:42:01
【问题描述】:
这是我试图在 haskell 中转换的代码。但是不变性造成了问题。如何在没有可变变量的情况下进行计算。创建[1..20] 列表并对其进行映射似乎并不节省空间。是否有任何技巧或技术来逃避不变性?
int main()
{
int i,n=0;
double sum= 0.0;
for ( i=1; i<20; ++i )
{
n += i;
sum = 1 / (double) n;
}
printf("The sum is: %lf",sum);
return 0;
}
【问题讨论】:
-
Haskell 可能会在不实现列表的情况下迭代列表,因此可能不会浪费空间。
-
@Thilo 即使记住这一点,计算仍然需要一点点突变。 我们不在 C 中标记所有
const的原因。不是争论,而是一切不可变的想法有时让我很痒。但是感谢您消除我的疑问! :) -
@GauravP - 如果你正在总结
n的倒数,你应该修复你的 C 代码:sum += 1 / (double) n -
@GauravP 你低估了编译器可以做的工作量。 Haskell 中的东西默认是不可变的。这减少了开销,因为编译器可以进行 C 编译器无法进行的优化,因为已经保证了不变性。
-
@ErikR 不完全是倒数的总和。它已针对我在作业中遇到的数学问题进行了修改。它需要 'n' 是每次迭代 'i' 中 1 到 'i' 的总和。
标签: haskell