Haskell 程序由定义和表达式组成。
常量值用name = expression定义。
five = 5
six = 3 + 3
函数用name parameters... = expression定义,其中的参数只用空格分隔。
add number1 number2 = number1 + number2
调用函数也是一种表达式,写出函数名,并为函数的每个形参依次传入实参,用空格分隔,和定义函数时一样。
five = add 2 3
可以用括号来指定表达式的求值顺序。
six = add 2 (1 * 4)
twelve = add 2 1 * 4
Haskell 使用空白和缩进来界定代码的边界。 属于某个表达式的代码,缩进必须比该表达式的起始位置更靠右。
-- A function split over multiple lines, so subsequent lines must be indented
add number1 number2 =
number1 + number2
https://en.wikibooks.org/wiki/Haskell/Indentation
模块会导出函数。 也就是说,你可以使用模块在其导出语句中公开的函数。 模块也可以定义仅供内部使用的函数。 默认情况下,没有显式导出的函数不能在模块外部使用。
在模块的开头,我们要指定模块名。 如果文件叫 Calculator.hs,那么模块就应该命名为 Calculator。 接着指定它导出的函数,之后就可以开始写这些函数了。 所以我们从下面这行开始。
module Calculator ( add ) where
https://learnyouahaskell.github.io/modules#making-our-own-modules
注释是 Haskell 文件中的一些文本,不会被当作代码解释。
它主要是给你自己和其他程序员阅读的。
单行注释有一种轻量的写法,基于两个连字符。
多行注释也可以用 {- 和 -} 这一对起止分隔符来实现。
-- a single line comment
-- another single line comment
{- a multiline comment
spanning multiple lines
-}
本练习的简介大量参考了 Learn You a Haskell for Great Good!,依据 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License 使用。
在这个练习中,你将编写一些代码,帮你照着最喜欢的烹饪书做出一份美味的千层面。
你有三个任务,它们都和烹饪千层面所花的时间有关。
定义expectedMinutesInOven常量,用来检查千层面应该在烤箱里烤多少分钟。根据烹饪书,预期的烤箱时间是 40 分钟:
expectedMinutesInOven
--> 40
定义preparationTimeInMinutes函数,它接受你加到千层面里的层数作为形参,并返回你准备这份千层面所花的分钟数。假设每铺一层需要 2 分钟。
preparationTimeInMinutes 3
--> 6
定义elapsedTimeInMinutes函数,它接受两个形参:第一个形参是你加到千层面里的层数,第二个形参是千层面已经在烤箱里烤了多少分钟。该函数应返回你在烹饪这份千层面上花掉的分钟数,也就是准备时间加上千层面此刻在烤箱里已用的时间。
elapsedTimeInMinutes 3 20
--> 26