【发布时间】:2021-04-29 17:31:33
【问题描述】:
我试图在列表推导中使用seq 来强制评估生成的元素,但:sprint 告诉我我的列表实际上没有被评估。例如:
Prelude> let foo a b = a + b
Prelude> let bar c = c + 1
Prelude> let lst = [bar $ foo x y | y <- [0..9], x <- [0..9]]
Prelude> :sprint lst
lst = _
Prelude> seq lst ()
()
Prelude> :sprint lst
lst = _
但其他人的map 似乎工作正常:
Prelude> let xs = map (+1) [1..10] :: [Int]
Prelude> :sprint xs
xs = _
Prelude> seq xs ()
()
Prelude> :sprint xs
xs = _ : _
为什么我的seq 不起作用?
【问题讨论】:
-
你在编译的 *.hs 文件中没有这个问题,因为当编译器完成后,一切都会有一个具体的类型
-
@Carsten 谢谢,这对我有帮助!
-
GHCi> :set +t它将打印每个计算值的类型。所以你总能马上看到类型是多态的还是单态的。
标签: list haskell evaluation