问题描述
从 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
这样的东西可以在运行时确定对类型的引用:因为编译器在编译时知道所有必需的类型,对象没有用相应的类型“标记”。