Sen*_*eno 0 polymorphism haskell composition
我有以下文件:
module SimpleComposition where
class Domain a where
f :: a -> a
g :: a -> a
h = f . g
Run Code Online (Sandbox Code Playgroud)
尝试在 ghci 中加载它时,出现错误
src\play.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
Run Code Online (Sandbox Code Playgroud)
我认为问题在于fand的类型gisforall a. Domain a => a ->a而不仅仅是a -> a,所以这些 foralls 是碍事的。但我还是想创作它们。如何?
这是单态限制的错误。因为你写的h = ...是一个常量应用形式,编译器拒绝为它推断多态形式,而是寻找某种方法将它默认为一个具体的类型——但没有可用的信息来做到这一点。
如果你添加它确实编译
{-# LANGUAGE NoMonomorphismRestriction #-}
Run Code Online (Sandbox Code Playgroud)
到文件的顶部。但更好的主意是自己明确地写下签名:
h :: Domain a => a -> a
h = f . g
Run Code Online (Sandbox Code Playgroud)
编译时启用或禁用单态限制。
请注意,在GHCi 中,默认情况下它是禁用的,但只有在加载模块后才会生效。在您只加载的模块中,它仍然适用。