Haskell:打印函数内变量的类型

问题描述

如何在 .hs 文件中打印函数内变量的类型?

从 ghci,我可以做 :type var。我如何执行以下操作:

sumList :: [Int] -> Int
sumList [] = 0
sumList (h:t) = traceShow (type h) $ h : sumList t

哪个会在每次递归迭代时打印类似 h::Int 的内容

解决方法

您可以将 typeOf :: forall a. Typeable a => a -> TypeRep 用于所有属于 Typeable 类型类实例的类型:

import Data.Typeable(typeOf)

sumList :: [Int] -> Int
sumList = foldr (\h -> traceShow (typeOf h) (h+)) 0

当然对于给定的 sumList 函数,它总是会返回 Int,因为这是列表中项目的类型。

由于 Haskell 具有完整的类型擦除,所以没有像 Java 的 instanceof 这样的东西可以在运行时确定对类型的引用:因为编译器在编译时知道所有必需的类型,对象没有用相应的类型“标记”。