隐式调用函数

w12*_*220 4 haskell implicit

我需要找到一种在Haskell中隐式调用函数的方法,类似于implicit在Scala中使用函数的方法。

我已经研究了使用隐式参数和函数中{-# LANGUAGE ImplicitParams #-}所示的方法,但是如果不明确定义它,我将无法弄清楚如何实现类似的效果。

这是我的代码的简化版本

a :: Int -> Int
a n = n + 1

b :: [Char] -> Int
b cs = length cs
Run Code Online (Sandbox Code Playgroud)

我希望能够跑步

Test> a "how long" -- outputs 8, as it implicitly calls a (b "how long")
Run Code Online (Sandbox Code Playgroud)

以及

Test> a 5 -- outputs 6
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 7

您在这里描述的是即席多态 [wiki]。在Haskell中,可以通过类型类 [wiki]实现

例如,我们可以定义一个类:

class Foo c where
    a :: c -> Int
Run Code Online (Sandbox Code Playgroud)

现在,我们可以定义的两个实例Foo:的实例Int和的实例String

{-# LANGUAGE FlexibleInstances #-}

instance Foo [Char] where
    a = length

instance Foo Int where
    a = (+) 1
Run Code Online (Sandbox Code Playgroud)

接下来,我们可以调用a

Prelude> a "how long"
8
Prelude> a (5 :: Int)
6
Run Code Online (Sandbox Code Playgroud)

  • @ w1220不,一般而言。具体来说,有一个针对String的东西(OverloadedStrings扩展名),但我强烈建议您不要为此使用它。学习在您的Haskell代码中编写Haskell,而不是Scala。 (3认同)