如何在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

我认为问题在于fand的类型gisforall a. Domain a => a ->a而不仅仅是a -> a,所以这些 foralls 是碍事的。但我还是想创作它们。如何?

回答

这是单态限制的错误。因为你写的h = ...是一个常量应用形式,编译器拒绝为它推断多态形式,而是寻找某种方法将它默认为一个具体的类型——但没有可用的信息来做到这一点。

如果你添加它确实编译

{-# LANGUAGE NoMonomorphismRestriction #-}

到文件的顶部。但更好的主意是自己明确地写下签名:

h :: Domain a => a -> a
h = f . g

编译时启用或禁用单态限制。

请注意,GHCi 中,默认情况下它是禁用的,但只有在加载模块后才会生效。在您只加载的模块中,它仍然适用。


以上是如何在Haskell中组合多态函数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>