在空列表上的foldMap时Haskell模糊类型变量编译器错误

问题描述

我正在尝试编写一个可简化嵌套列表的函数

代码

data nestedList a = Elem a | List [nestedList a]

flatten :: nestedList a -> [a]
flatten (Elem e) = [e]
flatten (List l) = foldMap flatten l

main = do
    let c0 = List []
    print $ flatten c0

当我尝试从main提供空列表时,出现编译器错误

Ambiguous type variable ‘a0’ arising from a use of ‘print’
  prevents the constraint ‘(Show a0)’ from being solved.
  Probable fix: use a type annotation to specify what ‘a0’ should be.

我想知道是什么原因导致此错误以及如何解决该问题。

非常感谢您的帮助!

解决方法

调用print :: (Show a) => a -> IO ()时,需要以某种方式解决对Show a的约束。在您的情况下,推断c0的类型为NestedList a,这当然不足以解决来自Show [a]的{​​{1}}约束的信息。

您可以通过在print $ flatten c0的绑定中添加类型签名以使其单态来解决此问题。