隐式调用函数

问题描述 投票:1回答:1

[我需要找到一种方法,以与在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
haskell implicit
1个回答
0
投票

您在这里描述的是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
© www.soinside.com 2019 - 2024. All rights reserved.