Неявно вызывать функцию - PullRequest
       13

Неявно вызывать функцию

4 голосов
/ 02 ноября 2019

Мне нужно найти способ неявного вызова функции в Haskell аналогичным образом, который вы можете сделать, используя implicit функции в Scala.

Я рассмотрел использование {-# LANGUAGE ImplicitParams #-}, как показано в Неявный параметр и функция , но я не могу понять, как добиться чего-то подобного без явного его определения.

Это очень сокращенная версия моего кода

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

1 Ответ

7 голосов
/ 02 ноября 2019

То, что вы здесь описываете, это специальный полиморфизм [wiki] . В Haskell это достигается с помощью классов типов [wiki] .

Например, мы можем определить класс:

class Foo c where
    a :: c -> Int

Теперь мы можемопределить два экземпляра Foo: экземпляр для Int и экземпляр для String:

{-# LANGUAGE <b>FlexibleInstances</b> #-}

instance Foo [Char] where
    a = length

instance Foo Int where
    a = (+) 1

Затем мы можем вызвать a с помощью:

Prelude> a "how long"
8
Prelude> a (5 :: Int)
6
...