我想在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实现这个目标吗?
答案 0 :(得分:4)
在这种特殊情况下很容易做到。简单地:
instance a ~ Int => Foo (String -> a) where foo = length
答案 1 :(得分:0)
在你的情况下,GHCI知道foo :: String -> ??
我们要将签名更改为String -> Int
:
print (foo "hello" :: Int)