我看过的许多Haskell教程几乎完全集中在语法上,而对如何构建程序的报道却很少。
例如......
以下是C ++应用程序的简要概述:
#include <iostream>
using namespace std;
int addition (int a, int b)
{
int r;
r=a+b;
return (r);
}
int main ()
{
int z;
z = addition (5,3);
cout << "The result is " << z;
return 0;
}
当我第一次开始学习C ++时,这些例子极大地帮助我学习如何将各个部分组合成工作程序。也许我正在寻找错误的地方,但我找不到任何像Haskell一样直接和简单的例子。
我已经知道很多Haskell语法。我可以编写递归列表推导,并操纵字符串,整数和列出wazoo。
简而言之:我只想知道Haskell中两个子程序和变量传递是什么样的。如果我能够对如何构造Haskell程序有一些基本的了解,我可能最终能够将我学到的所有语法都用到一些用途。
答案 0 :(得分:33)
Haskell程序的结构非常简单。你有一个main
函数来执行IO,就是这个。基础知识:
module Main where
addition a b = a + b
main :: IO ()
main = do let z = addition 5 3
putStrLn $ "The result is: " ++ show z
现在你可以使用类似的东西将它编译成一个简单的程序:
ghc --make Main.hs -o program
它应该生成一个名为program的可执行文件。
通常,程序的结构大多是纯函数,它们执行实际计算,并与处理IO的代码的离散部分相结合。 (当然有一些例外,但是编写尽可能多的纯代码的一般想法是相当普遍的。)
由于几乎所有内容都表示为一堆纯函数,因此不要在它们之间传递变量 - 函数通过传递参数进行通信。
代码中IO
的部分锚定在main
中。在大多数情况下,所有你的IO将通过main;即使你单独编写IO动作并给它们命名,它们最终也会从main
开始执行。
Haskell中的“函数组”称为“模块”。您可以拥有多个模块,每个模块都在自己的文件中:
module Blarg (exportedFunction) where
helper a b = ... -- this will *not* be exported
exportedFunction a b = helper a b -- this *will* be exported
实际上只会导出括号中的标识符;其余的都是隐藏的。如果您根本不包括括号,则默认情况下将导出所有内容。
将此文件另存为Blarg.hs
。现在,您可以在Main
中导入它:
import Blarg
将功能分组的另一种有用方法是where
:
complicatedFunction a b c = helper 0
where helper count = ...
这种方式helper
仅适用于complicatedFunction
,并且还可以a
访问b
,c
和complicatedFunction
。< / p>