gpt4 book ai didi

syntax - Haskell:我可以在带有绑定(bind)运算符(>>=)的 block 之后使用 where 子句吗?

转载 作者:行者123 更新时间:2023-12-04 02:54:37 26 4
gpt4 key购买 nike

我有一个非常简单的问题。我想在使用绑定(bind)运算符的代码块之后使用 where 子句,但出现编译错误。

这是一个简单的例子:

main =
putStrLn "where clause test:" >>
return [1..10] >>= \list ->
print list'
where list' = reverse list -- test1.hs:5:28: Not in scope: `list'

我可以对 list' 使用 let 子句,如
main =
putStrLn "where clause test:" >>
return [1..10] >>= \list ->
let list' = reverse list -- works of course
in print list'

但如果我可以使用 where 子句,我真的很喜欢它......

我也尝试过使用 do 表示法
main = do
putStrLn "where clause test:"
list <- return [1..10]
print list'
where list' = reverse list --test3.hs:5:30: Not in scope: `list'

同样的问题。在这些情况下我可以使用 where 子句吗?

最佳答案

正如 ehemient 所解释的,您不能使用 where条款的方式你做的。

发生错误是因为在此代码中:

main =
return [1..10] >>= \list ->
print list'
where
list' = reverse list
where -clause 附加到 main 函数。

这是带有更多括号的相同函数:
main = return [1..10] >>= (\list -> print list')
where
list' = reverse list

我认为你得到“ out of scope”错误的原因很明显: list 的绑定(bind)位于 main 的深处表达,而不是 where子句可以到达。

在这种情况下我通常会做什么(我已经被同样的事情咬过很多次了)。我只是简单地介绍一个函数并通过 list作为论据。
main = do
list <- return [1..10]
let list' = f list
print list'
where
f list = reverse list -- Consider renaming list,
-- or writing in point-free style

当然,我想你的实际代码在 f功能远不止 reverse这就是为什么你希望它在 where 中子句,而不是内联 let捆绑。如果 f里面的代码函数很小,我就写在 let里面绑定(bind),并且不会通过引入新功能的开销。

关于syntax - Haskell:我可以在带有绑定(bind)运算符(>>=)的 block 之后使用 where 子句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1156954/

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