解决重载函数的歧义

时间:2015-06-05 06:29:46

标签: haskell typeclass overloading

我想在Haskell中有一个重载函数。

{-# LANGUAGE FlexibleInstances #-}
class Foo a where
   foo :: a

instance Foo (String -> Int) where
   foo = length

instance Foo String where
   foo = "world"

然而,这种重载与类型歧义的处理非常差。 print $ foo "hello"会导致错误,print $ length "hello"工作正常。但是,如果我的实例列表是固定的,那么为什么Haskell无法意识到foo :: String -> a的唯一实例是foo :: String -> Int应该没有技术上的原因。我可以让Haskell实现这个目标吗?

2 个答案:

答案 0 :(得分:4)

在这种特殊情况下很容易做到。简单地:

instance a ~ Int => Foo (String -> a) where foo = length

答案 1 :(得分:0)

在你的情况下,GHCI知道foo :: String -> ??

我们要将签名更改为String -> Int

print (foo "hello" :: Int)