function - Haskell 程序的基本结构

标签 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 " << z;
  return 0;
}

当我第一次开始学习 C++ 时,这样的例子对我学习如何将各个单独的部分组装成工作程序有很大帮助。也许我找错了地方,但我还没有找到任何对于 Haskell 来说如此直接和简单的例子。

我已经了解很多 Haskell 语法。我可以编写递归列表推导式,操作字符串、整数,并列出 wazoo。

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

最佳答案

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 的代码的离散部分。 (当然也有异常(exception),但是编写尽可能多的纯代码的总体想法是相当普遍的。)

由于几乎所有内容都表示为一堆纯函数,因此您无需在它们之间传递变量 - 函数通过传递参数进行通信。

代码中执行 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 , bc来自complicatedFunction .

关于function - Haskell 程序的基本结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9153574/

相关文章:

list - Haskell 中埃拉托斯特尼优化筛

javascript - 基于非结构化JS对象创建结构化JS对象

c++ - C++ 中的罗马数字输出总是 "-858993460",不知道为什么?

采用可变数量参数的 Javascript 函数 - 更改它们的值 - 然后返回它们

javascript - 如何在不是对象或函数的对象实例上进行原型(prototype)设计?

haskell - 针对 unsafePerformIO 的部门限制

haskell - 了解 Haskell 类型签名

javascript - 什么数据结构/算法可用于在 JavaScript 中检索一对值(之前和之后)

c++ - 为什么尽管具有相同的算法和数据结构,但另一个解决方案的效率却提高了 10 倍?

r - 用分类变量拟合 nls 模型