Haskell 之 Variable

栏目: 编程语言 · 发布时间: 6年前

内容简介:在 Haskell 中的 variable 因為是 Immutable,所以算是 definition,負責程式碼中重複的部分;且有別於一般程式語言的是,由於 Haskell 將 function 也視為 data,因此 variable 也能是 function。若使用 IIFE,則有另外一種使用 Lambda 方式。GHC 8.4.3

在 Haskell 中的 variable 因為是 Immutable,所以算是 definition,負責程式碼中重複的部分;且有別於一般程式語言的是,由於 Haskell 將 function 也視為 data,因此 variable 也能是 function。

若使用 IIFE,則有另外一種使用 Lambda 方式。

Version

GHC 8.4.3

Haskell

Function

calChange given owed = 
  if given - owed > 0
  then given - owed
  else 0

以上簡單的 function,我們發現幾個問題:

given - owed
given - owed

在 Haskell 中有三種解法:

  • where
  • let
  • lambda

Where

calChange given owed = 
  if change > 0
  then change
  else 0
  where change = given - owed

使用 where 定義 change ,如此 ifthen 之後都可使用 change variable。

Let

calChange given owed = 
  let change = given - owed
  in if change > 0
     then change
     else 0

where 是定義在最後面,但也可使用 let 將 variable 定義在一開始,然後加上 in

Lambda

calChange given owed = 
  (\change -> if change > 0
              then change
              else 0) (given - owed)

將非共用的部分抽成 Lambda,再將 given - owed 共用的部分以 parameter 傳入 Lambda。

其實這就是 ECMAScript 的 IIFE。

FSharp

Function

let calChange given owed =
  if given - owed > 0
  then given - owed
  else 0

使用 let 定義 function,F# 與 Haskell 風格相當接近。

Let

let calChange given owed =
  let change = given - owed
  if change > 0
  then change
  else 0

使用 let 定義 change variable。

Lambda

let calChange given owed =
  (fun change -> if change > 0
                 then change
                 else 0) (given - owed)

F# 的 Lambda 使用 fun ,因為 F# 也支援 IIFE,因此寫法與 Haskell 很類似。

ECMAScript

Function

const calChange = (given, owed) => {
  if (given - owed > 0)
    return given - owed
  else
    return 0
};

最基本的寫法,使用 Arrow Function 定義 calChange()

const calChange = (given, owed) =>
  given - owed > 0 ? given - owed : 0;

由於 ECMAScript 支援 ?: 寫法,可以稍微化簡。

Const

const calChange = (given, owed) => {
  const change = given - owed;
  return change > 0 ? change : 0;
};

類似 Haskell 的 let 寫法,先定義 change variable。

Arrow Function

const calChange = (given, owed) =>
  (change => change > 0 ? change : 0)(given - owed);

如同 Haskell 的 Lambda 一樣,將非共用部分以 Arrow Function 表示,將共用的 given - owed 以 parameter 傳入。

這就是 IIFE,因為 ECMAScript 與 Haskell 都有 IIFE,所以能使用 Lambda 或 Arrow Function 抽出非共用部分。

CSharp

Function

Func<int, int, int> CalChange = (given, owed) =>
{
  if (given - owed > 0)
    return given - owed;
  else
    return 0;
};

使用 Func 定義 function,其餘寫法一樣。

Func<int, int, int> CalChange = (given, owed) => 
  given - owed > 0 ? given - owed : 0;

由於 C# 支援 ?: 寫法,可以稍微化簡。

Var

Func<int, int, int> CalChange = (given, owed) =>
{
  var change = given - owed;
  return change > 0 ? change : 0;
};

類似 Haskell 的 let 寫法,先定義 change variable。

Func<int, int, int> CalChange = (given, owed) =>
{
  Func<int, int> Body = change => change > 0 ? change : 0;
  return Body(given - owed);
};

因為 C# 沒有 IIFE,因此只能先定義好 Body function,然後將 given - owed 傳入。

Conclusion

  • 傳統都會將共用部分抽成 Lambda 或 Arrow Function,但配合 IIFE,也看到另外一種用法,將非共用部分以 Lambda 表示,將共用部分以 parameter 傳入
  • C# 因為沒有 IIFE,所以使用 Lambda 的效果較不顯著

Reference

Will Kurt, Get Programming with Haskell


以上所述就是小编给大家介绍的《Haskell 之 Variable》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Introduction to Programming in Java

Introduction to Programming in Java

Robert Sedgewick、Kevin Wayne / Addison-Wesley / 2007-7-27 / USD 89.00

By emphasizing the application of computer programming not only in success stories in the software industry but also in familiar scenarios in physical and biological science, engineering, and appli......一起来看看 《Introduction to Programming in Java》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具