相关疑难解决方法(0)

什么是单态限制?

令我感到困惑的是,haskell编译器有时会推断出比我预期的更不易变形的类型,例如在使用无点定义时.

似乎问题是"单态限制",默认情况下在旧版本的编译器上启用.

考虑以下haskell程序:

{-# LANGUAGE MonomorphismRestriction #-}

import Data.List(sortBy)

plus = (+)
plus' x = (+ x)

sort = sortBy compare

main = do
  print $ plus' 1.0 2.0
  print $ plus 1.0 2.0
  print $ sort [3, 1, 2]
Run Code Online (Sandbox Code Playgroud)

如果我编译它,ghc我没有获得错误,可执行文件的输出是:

3.0
3.0
[1,2,3]
Run Code Online (Sandbox Code Playgroud)

如果我将main身体改为:

main = do
  print $ plus' 1.0 2.0
  print $ plus (1 :: Int) 2
  print $ sort [3, 1, 2]
Run Code Online (Sandbox Code Playgroud)

我没有编译时错误,输出变为:

3.0
3
[1,2,3]
Run Code Online (Sandbox Code Playgroud)

正如所料.但是,如果我尝试将其更改为:

main = do
  print $ …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell types type-inference monomorphism-restriction

60
推荐指数
1
解决办法
4768
查看次数

在什么情况下,Common Subexpression Elimination会影响Haskell程序的懒惰?

来自wiki.haskell.org:

首先,公共子表达式消除(CSE)意味着如果表达式出现在多个位置,则重新排列代码,以便仅计算该表达式的值一次.例如:

foo x = (bar x) * (bar x)
Run Code Online (Sandbox Code Playgroud)

可能会变成

foo x = let x' = bar x in x' * x'
Run Code Online (Sandbox Code Playgroud)

因此,bar函数只被调用一次.(如果bar是一个特别昂贵的功能,这可能会节省很多工作.)GHC实际上并不像你期望的那样经常执行CSE.问题是,执行CSE会影响程序的严格性/懒惰性.所以GHC确实做了CSE,但仅在特定情况下---参见GHC手册.(部分??)

长话短说:"如果你关心CSE,那就亲手做吧."

我想知道在什么情况下CSE"影响"程序的严格/懒惰以及可能产生什么样的影响.

haskell ghc

13
推荐指数
1
解决办法
344
查看次数