Haskell: 是否可以将类型作为程序的一部分输出?

3
为了帮助调试和编写Haskell程序,我正在考虑使Haskell程序能够作为程序的一部分输出变量的类型。例如,我有以下代码:
listHEADFiles :: ReaderT LgRepo IO ()
listHEADFiles = do
  ref <- resolveReference $ T.pack "HEAD"
  case ref of 
    Nothing -> fail "Could not resolve reference named 'HEAD'"
    Just reference -> do
      obj <- lookupObject reference
      case obj of 
        CommitObj commit -> do
          objects <- listAllObjects Nothing (commitOid commit)
          for_ objects (\case 
            TreeObjOid toOid -> do
              tree <- lookupTree toOid
              treeEntries <- sourceTreeEntries tree
              entries <- lift $ treeEntries
              outputTypeOf entries
            )
        _ -> fail "'HEAD' is not a commit object"

我想输出变量entries的类型,因为我不理解在提取该值后到底发生了什么。我可以查看文档,但手动计算总是让我感到困惑。当我的程序执行时,我想确定它的确切类型。换句话说,我希望在我的程序中使用ghci:t的功能。这是可能的吗?

1个回答

4

你并不希望程序输出一个类型:相反,你希望编译器在编译程序时输出类型。你需要的功能是部分类型签名。其思想是在表达式上放置一个不完整的签名,然后你会得到一个编译器的“错误”提示,告诉你如何填写空白部分。如果你完全没有类型的概念,一个可以接受的不完整签名就只是_

(entries :: _) <- lift $ treeEntries

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接