如何在Haskell中组合多态函数?
我有以下文件:
module SimpleComposition where
class Domain a where
f :: a -> a
g :: a -> a
h = f . g
尝试在 ghci 中加载它时,出现错误
srcplay.hs:7:5: error:
* No instance for (Domain c0) arising from a use of `f'
* In the first argument of `(.)', namely `f'
In the expression: f . g
In an equation for `h': h = f . g
我认为问题在于f
and的类型g
isforall a. Domain a => a ->a
而不仅仅是a -> a
,所以这些 foralls 是碍事的。但我还是想创作它们。如何?
回答
这是单态限制的错误。因为你写的h = ...
是一个常量应用形式,编译器拒绝为它推断多态形式,而是寻找某种方法将它默认为一个具体的类型——但没有可用的信息来做到这一点。
如果你添加它确实编译
{-# LANGUAGE NoMonomorphismRestriction #-}
到文件的顶部。但更好的主意是自己明确地写下签名:
h :: Domain a => a -> a
h = f . g
编译时启用或禁用单态限制。
请注意,在GHCi 中,默认情况下它是禁用的,但只有在加载模块后才会生效。在您只加载的模块中,它仍然适用。