Function Haskell程序的基本结构
我看过的许多Haskell教程几乎完全关注语法,很少涉及如何构造程序 例如Function Haskell程序的基本结构,function,haskell,data-structures,subroutine,Function,Haskell,Data Structures,Subroutine,我看过的许多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 " &l
这里是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;
}
#包括
使用名称空间std;
整数加法(整数a,整数b)
{
INTR;
r=a+b;
回报率(r);
}
int main()
{
intz;
z=加法(5,3);
coutHaskell程序的结构出人意料地简单。您有一个执行IO的main
函数,仅此而已。因此基础知识:
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
另一种对函数进行分组的有用方法是,其中
:
complicatedFunction a b c = helper 0
where helper count = ...
这种方式helper
仅适用于compleddefunction
的范围,而且还可以从compleddefunction
中访问a
、b
和c
,我会从我正在学习Clojure之类的地方开始。不过,我确实有O'Reilly Haskell的书,这本书————看起来很不错回顾。虽然这是一个合理的问题,但请允许我指出您对Haskell的理解有点错误。Haskell尽可能强调纯函数,并且大多数Haskell实现都提供了REPL(读取-评估-打印循环)在那里你可以玩你定义的函数。我强烈建议,与其制作打印到标准输出的小程序,不如编写函数并在ghci中玩。我想你会发现学习Haskell更灵活、更有趣。@DanBurton上个月我可能读过语法,并玩过ghci中的函数和列表理解。我现在准备制作一个程序。(:D你是对的,我对哈斯克尔的看法是错误的。我正在尝试将过程编程原理应用到函数编程语言中。我仍在努力思考如何将一堆函数转换为可以执行多次运行和停止的功能。我会继续阅读。@octopusgrabbus这是我第一次看到t他用5步链接Haskell。据我所知,我可以通过主调用和循环下面列出的各种函数来创建一个Haskell程序?@sublearray:下面没有:在Haskell中,函数在源文件中的顺序可以是任意的。谢谢您的回复。我熟悉main,但我如何制作其他子例程,并让这些子例程相互通信和传递变量?您实际上没有“子例程”,你有函数。因为没有变异,你把值作为参数传递给那些函数(比如我的例子中的addition 5 3
)。对。我的意思是,你如何建立其他的“函数组”基本上,我不想把所有的东西都放在main中。有关Haskell模块的信息,请参阅此wiki页面:@dflemstr:这不是wiki页面,这是一个温和的介绍:)