我知道它应该是可能的,但是,由于缺乏文档,它需要一些相当大的逆向工程努力才能弄明白。因此,使用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(虽然我不是那么具体但我没有得到我需要的答案)。
答案 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
所以它不会是“纯粹的”,除非你想要降低水平?