gpt4 book ai didi

haskell - 如何在 Haskell 中使 CAF 不是 CAF?

转载 作者:行者123 更新时间:2023-12-02 05:57:26 27 4
gpt4 key购买 nike

如何将常量应用形式变成,而不是常量应用形式,以阻止它在程序的生命周期中保留?

我尝试过这种方法:

-- | Dummy parameter to avoid creating a CAF
twoTrues :: () -> [[[Bool]]]
twoTrues _ = map (++ (True : repeat False)) . trueBlock <$> [1..]

但它似乎不起作用 - 配置文件显示它仍然被保留并且仍然将其标记为 CAF。

我找到了一个与此相关的 Google 结果:a reply by Simon Peyton-Jones尼尔·米切尔 (Neil Mitchell) 正是问了这个问题 - 但不幸的是,这个答案指的是一个死链接。

最佳答案

完整示例

这里有一个小例子来说明这种情况:

module A where

big :: () -> [Int]
big _ = [1..10^7]

看起来像一个函数,对吧?但GHC 是做什么的呢?它将枚举 float 到顶层!

A.big1 :: [Int]
[ Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=False,
ConLike=False, Cheap=False, Expandable=False,
Guidance=IF_ARGS [] 7 0}]
A.big1 =
case A.$wf1 10 A.big2 of ww_sDD { __DEFAULT ->
eftInt 1 ww_sDD
}

A.big :: () -> [Int]
[Arity=1,
Unf=Unf{Src=InlineStable, TopLvl=True, Arity=1, Value=True,
ConLike=True, Cheap=True, Expandable=True,
Guidance=ALWAYS_IF(unsat_ok=True,boring_ok=True)
Tmpl= \ _ -> A.big1}]
A.big = \ _ -> A.big1

糟糕!

<小时/>

那么我们能做什么呢?

关闭优化

这可行,-Onot,但不可取:

A.big :: () -> [Int]
[GblId, Arity=1]
A.big =
\ _ ->
enumFromTo
@ Int
$fEnumInt
(I# 1)
(^
@ Int
@ Type.Integer
$fNumInt
$fIntegralInteger
(I# 10)
(smallInteger 7))

不要内联,多一些函数

所有内容都放入一个函数中,包括enumFromTo,将参数传递给工作人员:

big :: () -> [Int]
big u = myEnumFromTo u 1 (10^7)
{-# NOINLINE big #-}

myEnumFromTo :: () -> Int -> Int -> [Int]
myEnumFromTo _ n m = enumFromTo n m
{-# NOINLINE myEnumFromTo #-}

现在我们终于摆脱了 CAF!即使使用 -O2

A.myEnumFromTo [InlPrag=NOINLINE]
:: () -> Int -> Int -> [Int]
A.myEnumFromTo =
\ _ (n_afx :: Int) (m_afy :: Int) ->
$fEnumInt_$cenumFromTo n_afx m_afy

A.big [InlPrag=NOINLINE] :: () -> [Int]
A.big = \ (u_abx :: ()) -> A.myEnumFromTo u_abx A.$s^2 lvl3_rEe

耶。

<小时/>

什么不起作用?

关闭-ffull-lazyness

完整的惰性转换使定义向外 float 。默认情况下,-O1 或以上版本处于打开状态。让我们尝试使用 -fno-full-laziness 将其关闭。但是,这不起作用。

关于haskell - 如何在 Haskell 中使 CAF 不是 CAF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6090932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com