Haskell程序的基本结构

sub*_*ray 30 haskell function subroutine data-structures

我看过的许多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;
}
Run Code Online (Sandbox Code Playgroud)

当我第一次开始学习C++时,这些例子极大地帮助我学习如何将各个部分组合成工作程序.也许我正在寻找错误的地方,但我找不到任何像Haskell那样直接和简单的例子.

我已经知道很多Haskell语法.我可以编写递归列表推导,并操纵字符串,整数和列出wazoo.

简而言之:我只想知道Haskell中两个子例程和变量传递是什么样的.如果我能够对如何构造Haskell程序有一些基本的了解,我可能最终能够将我学到的所有语法都用于某些用途.

Tik*_*vis 33

Haskell程序的结构非常简单.你有一个mainIO功能,就是它.基础知识:

module Main where

addition a b = a + b

main :: IO ()
main = do let z = addition 5 3
          putStrLn $ "The result is: " ++ show z
Run Code Online (Sandbox Code Playgroud)

现在你可以使用类似的东西将它编译成一个简单的程序:

ghc --make Main.hs -o program
Run Code Online (Sandbox Code Playgroud)

它应该生成一个名为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
Run Code Online (Sandbox Code Playgroud)

实际上只会导出括号中的标识符; 其余的都是隐藏的.如果您根本不包括括号,则默认情况下将导出所有内容.

将此文件另存为Blarg.hs.现在您可以将其导入Main:

import Blarg
Run Code Online (Sandbox Code Playgroud)

另一种分组功能的有用方法是where:

complicatedFunction a b c = helper 0
  where helper count = ...
Run Code Online (Sandbox Code Playgroud)

这样,helper仅在范围的complicatedFunction,也有进入a,b并c从complicatedFunction.

  • 你没有"子程序",你有*函数*.由于没有变异,你将值作为参数传递给那些函数(比如我的例子中的`addition 5 3`). (3认同)