gpt4 book ai didi

haskell - 使用/不使用 lambda 定义函数

转载 作者:行者123 更新时间:2023-12-02 18:20:26 25 4
gpt4 key购买 nike

使用 GHC 编译模块时,使用 lambda 表达式定义函数与不使用 lambda 表达式定义函数有何区别

f :: A -> B
f = \x -> ...

对比

f :: A -> B
f x = ...

我想我看到它有助于编译器内联函数,但除此之外,如果我从第一个版本更改为第二个版本,它会对我的代码产生影响。

我试图理解别人的代码,并理解为什么这个函数是用第一种方式而不是第二种方式定义的。

最佳答案

为了回答这个问题,我用两种方式编写了一个小程序,并查看了生成的核心:

f1 :: Int -> Int
f1 = \x -> x + 2
{-# NOINLINE f1 #-}

f2 :: Int -> Int
f2 x = x + 2
{-# NOINLINE f2 #-}

我通过运行 ghc test.hs -ddump-simpl 来获取核心。相关部分是:

f1_rjG :: Int -> Int
[GblId, Arity=1, Str=DmdType]
f1_rjG =
\ (x_alH :: Int) -> + @ Int GHC.Num.$fNumInt x_alH (GHC.Types.I# 2)

f2_rlx :: Int -> Int
[GblId, Arity=1, Str=DmdType]
f2_rlx =
\ (x_amG :: Int) -> + @ Int GHC.Num.$fNumInt x_amG (GHC.Types.I# 2)

结果是相同的,因此回答您的问题:从一种形式更改为另一种形式没有影响。

<小时/>

话虽如此,我建议查看 leftaroundabout 的答案,该答案涉及实际存在差异的情况。

关于haskell - 使用/不使用 lambda 定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32270919/

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