【发布时间】:2012-01-06 15:52:03
【问题描述】:
在下面的代码中,最后一个短语我可以在前面放一个in。它会改变什么吗?
另一个问题:如果我决定将in 放在最后一个短语的前面,我需要缩进吗?
我试过不缩进和拥抱抱怨
do {...} 中的最后一个生成器必须是表达式
import Data.Char
groupsOf _ [] = []
groupsOf n xs =
take n xs : groupsOf n ( tail xs )
problem_8 x = maximum . map product . groupsOf 5 $ x
main = do t <- readFile "p8.log"
let digits = map digitToInt $concat $ lines t
print $ problem_8 digits
编辑
好的,所以人们似乎不明白我在说什么。让我改写一下: 考虑到上面的上下文,以下两个是否相同?
1.
let digits = map digitToInt $concat $ lines t
print $ problem_8 digits
2.
let digits = map digitToInt $concat $ lines t
in print $ problem_8 digits
关于let 中声明的绑定范围的另一个问题:我读到here:
where子句。
有时在几个受保护的方程式上进行范围绑定很方便,这需要一个 where 子句:
f x y | y>z = ...
| y==z = ...
| y<z = ...
where z = x*x
请注意,这不能使用 let 表达式来完成,它仅作用于 它所包含的表达式。
我的问题:所以,最后一个打印短语不应该看到可变数字。我错过了什么吗?
【问题讨论】:
-
您知道
do表示法的真正含义还是对您来说是一个黑匣子?知道它的胆量,你提到的一切对我来说似乎都是非常直观的。当然,在不了解先决条件的情况下,直觉只能到此为止…… -
OK 现在我得到了缩进部分。基本上,如果我不缩进,“do”会将其视为一项独立任务,与 let 相同级别。另一个问题:我必须使用 let 来声明变量吗?
-
@osager:Haskell 并没有真正的“变量”。您可以将“值”绑定到给定名称。如果您真的想在内存中有一个单元格,您可以在程序执行期间使用不同的值进行修改,您需要使用
IORef或类似名称。但一般鼓励新手学习函数式的做事方式,这会极力避免修改引用的值。 -
谢谢丹。我也开始意识到(令我惊讶的是)haskell 并没有真正使用变量的概念!但是,我发现 Haskell 的语法比函数式编程的思维方式更难掌握!
标签: haskell scope whitespace where-clause let