[我需要找到一种方法,以与在Scala中使用implicit
函数相似的方式隐式调用Haskell中的函数。
我已经研究过使用{-# LANGUAGE ImplicitParams #-}
中所示的Implicit parameter and function,但是如果不明确定义它,我将无法弄清楚如何实现类似的目标。
这是我的代码的简化版本
a :: Int -> Int
a n = n + 1
b :: [Char] -> Int
b cs = length cs
我希望能够跑步
Test> a "how long" -- outputs 8, as it implicitly calls a (b "how long")
以及
Test> a 5 -- outputs 6
您在这里描述的是ad hoc polymorphism [wiki]。在Haskell中,可以通过type classes [wiki]实现。
例如,我们可以定义一个类:
class Foo c where
a :: c -> Int
现在我们可以定义Foo
的两个实例:Int
的实例和String
的实例:
{-# LANGUAGE FlexibleInstances #-}
instance Foo [Char] where
a = length
instance Foo Int where
a = (+) 1
接下来我们可以通过以下方式呼叫a
:
Prelude> a "how long"
8
Prelude> a (5 :: Int)
6