Использование классов haskell внутри функции - PullRequest
0 голосов
/ 01 мая 2018

Представьте, что есть какой-то класс:

class Foo a where
  g :: b -> a
  f :: a -> b

Я хочу написать следующую функцию:

h :: a -> a
h = f . g

Но для этого мне нужен какой-то способ указать точный экземпляр Foo, который я использую. Есть ли способ сделать это подобным тому, как Rust использует черты? Я почти уверен, что мог бы использовать шаблон haskell для создания этой функции каждый раз с помощью поставляемого класса, но если возможно, я бы хотел об этом.

1 Ответ

0 голосов
/ 01 мая 2018

Если вы хотите, чтобы h самостоятельно решил, какой экземпляр использовать, просто предоставьте аннотацию, чтобы устранить неоднозначность. Скажем, если вы хотите выбрать b ~ Int

h :: Foo a => a -> a
h = f . (g :: Int -> a)

(я думаю, Foo понадобится еще один параметр b в вашем реальном классе, но в таком случае этот подход может быть адаптирован по мере необходимости).

Если вместо этого вам нужен вызывающий из h, чтобы выбрать экземпляр, а не h, вы можете использовать AmbiguousTypes и TypeApplicationsScopedTypeVariables).

h :: forall b a . Foo a => a -> a
h = f . (g :: b -> a)

Позже вы можете позвонить h, например, h @ Int, чтобы выбрать b ~ Int.

...