在Haskell丝毫实施(Implementing Iota in Haskell)

2019-07-30 23:53发布

IOTA是一个小得可笑“的编程语言”只使用一个组合子。 我有兴趣了解它是如何工作的,但它是有益的,看看在我熟悉的语言实现。

我发现写在方案中丝毫编程语言的实现。 我一直有一个小麻烦翻译它虽然哈斯克尔。 这是相当简单的,但我是比较新的两个Haskell和方案。

你会如何写在Haskell等效丝毫实施?

(let iota ()
  (if (eq? #\* (read-char)) ((iota)(iota))
      (lambda (c) ((c (lambda (x) (lambda (y) (lambda (z) ((x z)(y z))))))
           (lambda (x) (lambda (y) x))))))

Answer 1:

我一直在自学一些这方面的东西,所以我真的希望我得到下面的权利......

由于纳米提到,那Haskell是键入的事实是对这个问题极为重要; 类型系统限制可以形成什么表情,特别是对于演算最基本的类型系统禁止自应用程序,这最终给你一个非图灵完备的语言。 图灵完整性的基本类型的系统顶部加入作为额外的功能的语言(或者是fix :: (a -> a) -> a操作员或递归类型)。

这并不意味着你无法实现这个在Haskell所有,而是这样的实现不会只有一个运营商。

方法#1:实施第二示例单点组合的逻辑基础从这里 ,并添加一个fix功能:

iota' :: ((t1 -> t2 -> t1)
          -> ((t5 -> t4 -> t3) -> (t5 -> t4) -> t5 -> t3)
          -> (t6 -> t7 -> t6)
          -> t)
         -> t
iota' x = x k s k 
    where k x y = x
          s x y z = x z (y z)

fix :: (a -> a) -> a
fix f = let result = f result in result

现在,您可以在以下方面编写任何程序iota'fix 。 解释它是如何工作是参与了一下。 ( 编辑:注意,这iota'不一样的λx.x SK在原来的问题,这是λx.x KSK ,这也是图灵完备的它是如此。 iota'节目将是来自不同iota 。节目我已经试过iota = λx.x SK在Haskell定义,它typechecks,但是当你尝试k = iota (iota (iota iota))s = iota (iota (iota (iota iota)))你获得类型的错误。)

方法2:无类型演算denotations可以使用这种递归类型被嵌入到Haskell中:

newtype D = In { out :: D -> D }

D基本上是一种类型,其元素是功能从DD 。 我们必须In :: (D -> D) -> D的转换D -> D功能到纯D ,并out :: D -> (D -> D)做相反。 因此,如果我们有x :: D ,我们可以通过做自其应用out xx :: D

给的是,现在我们可以这样写:

iota :: D
iota = In $ \x -> out (out x s) k
    where k = In $ \x -> In $ \y -> x
          s = In $ \x -> In $ \y -> In $ \z -> out (out x z) (out y z)

这需要从一些“噪音” Inout ; 哈斯克尔仍然禁止你的应用DD ,但我们可以用Inout来解决这个问题。 你不能真正做任何类型的值有用D ,但你可以设计大约在同一模式的有益的类型。


编辑:IOTA基本上λx.x SK ,其中K = λx.λy.xS = λx.λy.λz.xz (yz) 即,ι-需要两个参数的函数并将其应用于与S和K; 通过传递返回你得到S是其第一个参数的功能,并通过将返回你K.所以,如果你写了“返回第一个参数”和“返回第二个参数”使用ι-第二个参数的函数,你可以写S和K的丝毫。 但S和K的足以让图灵完备 ,所以你还在讨价还价获得图灵完备。 它变成可以使用ι-编写必要的选择功能,所以丝毫就够了图灵完整性。

因此,这减少了丝毫的理解与理解SK结石的问题。



文章来源: Implementing Iota in Haskell