我正在尝试使用箭头并面临恼人的问题 - 我必须为我实现的所有函数提供显式类型。 如果我不提供它,ghc 会输出一些错误,例如
No instance for (Arrow a0) arising from a use of ‘...’
The type variable ‘a0’ is ambiguous
我可以提供显式类型,但这非常烦人,因为每次我更改某些函数时,我都可能必须手动更改依赖于更改的每个函数的类型。
是否可以强制 ghc 自动推断函数类型?
小事
import Control.Arrow
ss = arr
原因
No instance for (Arrow a0) arising from a use of ‘arr’
The type variable ‘a0’ is ambiguous
Relevant bindings include
ss :: (b -> c) -> a0 b c (bound at src/Main.hs:62:1)
Note: there are several potential instances:
instance Arrow Coroutine -- Defined at src/Main.hs:33:10
instance Arrow (->) -- Defined in ‘Control.Arrow’
instance Monad m => Arrow (Kleisli m) -- Defined in ‘Control.Arrow’
In the expression: arr
In an equation for ‘ss’: ss = arr
而代码具有完全相同的语义
import Control.Arrow
ss :: forall a b c. (Arrow a) => (b -> c) -> a b c
ss = arr
编译得很好。
最简单的事情是关闭单态限制 - 将其放在源文件的顶部:
{-# LANGUAGE NoMonomorphismRestriction #-}
错误的原因是,虽然 Haskell 可以很好地推断
ss
的类型,但单态性限制要求在值的顶级定义中,类型在类型类上不是多态的(例如 Arrow
)除非有明确的类型签名。