gpt4 book ai didi

function - Haskell 中 where 表示法的好处

转载 作者:行者123 更新时间:2023-12-04 23:01:31 64 4
gpt4 key购买 nike

与 Haskell 中的 where 表示法相比,显式函数定义的优缺点是什么?

显式函数定义:

foo :: Integer -> Integer
foo a = bar a
where
bar :: Integer -> Integer
bar a = Some code here

相对于:
foo :: Integer -> Integer
foo a = bar a

bar :: Integer -> Integer
bar a = Some code here

为什么我要使用其中一个?关于效率有什么需要注意的吗?安全?代码可重用性?代码可读性?

最佳答案

如果您的辅助功能不会在其他任何地方使用,最好不要污染命名空间并使用本地定义。

当您的外部函数只有一个顶级“模式”时,where子句可以简化辅助函数的定义,因为外部函数的参数将在范围内。

outer x v z f = undefined
where
inner i = i + x + v + z + f

相对
outer x v z f = undefined

inner x v z f i = i + x + v + z + f

如果您的函数有多个顶级“模式”,那么您不能使用 where 跨模式共享绑定(bind)。 .您必须定义顶级绑定(bind)。

某些使用方法 where可能会导致不明显的性能损失。这个定义(取自 let vs where 上的 HaskellWiki 文章)
fib x = map fib' [0 ..] !! x
where
fib' 0 = 0
fib' 1 = 1
fib' n = fib (n - 1) + fib (n - 2)

比这个慢:
fib = (map fib' [0 ..] !!)
where
fib' 0 = 0
fib' 1 = 1
fib' n = fib (n - 1) + fib (n - 2)

也比定义 fib' 慢在顶层。

原因是,在第一个定义中,新的 fib'为每次调用 fib 创建.解释 here .

关于function - Haskell 中 where 表示法的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587912/

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