Haskell 到 Raku - 简而言之

Haskell 和 Raku 是非常不同的语言。这很明显。 但是,这并不意味着没有相似之处或共同的想法! 此页面尝试让一个 Haskell 用户启动并运行 Raku。Haskell 用户可能会发现,在用 Raku 编写脚本时,他们不需要放弃所有 Haskelly 的想法。

请注意,这不应该被误认为是初学者教程或 Raku 概述; 它旨在作为具有强大 Haskell 背景的 Raku 学习者的技术参考。

类型

类型 vs 值

在 Haskell 中, 您有类型级编程, 然后进行值级编程。

  1. plusTwo :: Integer -> Integer -- Types
  2. plusTwo x = x + 2 -- Values

您不要像下面那样在 Haskell 中混合类型和值。

  1. plusTwo 2 -- This is valid
  2. plusTwo Integer -- This is not valid

在 Raku 中, 类型(亦称为类型对象)和值处于同样的级别

  1. sub plus-two(Int $x --> Int) { $x + 2 }
  2. plus-two(2); # This is valid
  3. plus-two(Int); # This is valid

我将再用一个例子来说明 Raku 这个独特之处:

  1. multi sub is-string(Str $ --> True) {}
  2. multi sub is-string(Any $ --> False) {}
  3. is-string('hello'); #True
  4. is-string(4); #False

Maybe

在 Haskell 中,您有一个 Maybe 类型, 可以让您放弃空类型的烦恼。 假设您有一个将 String 解析为 Integer 的假设函数:

  1. parseInt :: String -> Maybe Integer
  2. case parseInt myString of
  3. Just x -> x
  4. Nothing -> 0

在 Raku 中, 由于类型对象与常规对象共存,因此我们拥有 DefinedUndefined 对象的概念。 平常的类型对象是 undefined 的, 而实例化后的对象是 defined 的。