使用Idris作为纯Haskell库的例子?

时间:2018-04-07 00:01:35

标签: haskell idris

我知道它应该是可能的,但是,由于缺乏文档,它需要一些相当大的逆向工程努力才能弄明白。因此,使用Idris作为Haskell库的例子是什么?可能的用法说明:

import Idris

code :: String
code = unlines [
  "data Nat : Type where                ",
  "  Zero : Nat -> Nat                  ",
  "  Suc  : Nat                         ",
  "                                     ",
  "double : Nat -> Nat                  ",
  "double Zero    = Zero                ",
  "double (Suc n) = Suc (Suc (double n))",
  "                                     ",
  "n2 : Nat                             ",
  "n2 = double (Suc Zero)               "]

main :: IO ()
main = do

  -- prints "Nat -> Nat"
  print $ typeOf "double" code

  -- prints "Suc (Suc Zero)"
  print $ normOf "n2" code

  -- prints the context of a hole at given index
  print $ contextAt <index> code

此外,我想知道这样的库是纯粹的(即没有系统调用,基于字符串),因此能够由GHCJS编译。我发布了关于Agda的similar question(虽然我不是那么具体但我没有得到我需要的答案)。

1 个答案:

答案 0 :(得分:2)

这个博客文章中有一个通过Idris编译程序作为库的示例。 https://brianmckenna.org/blog/idris_library

你看到的Idris monad是StateT IState (ExceptT Err IO) - 状态和失败的IO。 https://github.com/idris-lang/Idris-dev/blob/master/src/Idris/AbsSyntaxTree.hs#L426 所以它不会是“纯粹的”,除非你想要降低水平?