小编Cif*_*gum的帖子

为什么 Haskell 不能优化这个重复的函数调用?

在我的 Haskell 代码中,我使用了一个经常被调用的函数,如下所示:

doSomething x y = (a, b)
where a = expensive1 x y
      b = expensive2 x y a
Run Code Online (Sandbox Code Playgroud)

使用 GHC 8.10.3 和 -O2 编译我的程序需要大约 45 秒才能运行。但是,如果我像这样编写相同的函数:

doSomething x y = (a, b)
where a = expensive1 x y
      b = expensive2 x y (expensive1 x y)
Run Code Online (Sandbox Code Playgroud)

我的程序需要大约 60 秒才能运行。

编译器不应该识别重复的调用expensive1 x y并将其优化掉吗?expensive1并且expensive2是纯函数,因此expensive1 x y不需要重新计算。或者 GC 是否过于激进和垃圾收集,a之后才b需要?

haskell

7
推荐指数
1
解决办法
121
查看次数

从 Haskell 中的列表构造依赖类型

我想用 Haskell 为 Galois 字段编写一个库。伽罗瓦域由其不可约多项式定义。只有具有相同的伽罗瓦域的伽罗瓦域元素才能相加。我想将多项式提升为我的伽罗瓦域的类型,例如,具有多项式 [1, 2, 3] 的伽罗瓦域与具有多项式 [2, 0, 1] 的伽罗瓦域具有不同的类型。这样我可以确保只能添加​​具有相同伽罗瓦域的伽罗瓦域元素。这可能吗?

我的多项式数据类型如下所示:

newtype Polynomial a = Polynomial [a]
Run Code Online (Sandbox Code Playgroud)

我的 Galois 字段数据类型如下所示:

data GF irr a = GF {
    irreducible :: irr
  , q :: PrimePower
}
Run Code Online (Sandbox Code Playgroud)

所以我想要一个构造函数,它接受一个多项式(例如(Polynomial [2, 0, 1]))并给我一个类型的 Galois 域GF (Polynomial Int) ([2, 0, 1])。我知道这[2, 0, 1]不是一个有效的类型,但我看到使用Data.Singletons可以创建类似的类型

(SCons STrue (SCons SFalse SNil))
Run Code Online (Sandbox Code Playgroud)

for [True, False],但我不知道如何从我的列表中构造喜欢这些类型的类型[2, 0, 1]以及构造函数的外观。

singleton haskell

5
推荐指数
1
解决办法
190
查看次数

标签 统计

haskell ×2

singleton ×1