在haskell和Arrows中输入推断

时间:2014-08-30 11:39:33

标签: haskell types arrows

我正在尝试使用箭头并遇到恼人的问题 - 我必须为我实现的所有功能提供显式类型。 如果我没有提供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

汇编得非常好。

1 个答案:

答案 0 :(得分:4)

最简单的方法是关闭单态限制 - 将它放在源文件的顶部:

{-# LANGUAGE NoMonomorphismRestriction #-}

您的错误的原因是虽然Haskell可以推断ss罚款的类型,但单态限制要求在值的顶级定义中,类型不是类型类的多态(例如Arrow)除非有明确的类型签名。