Объявления Haskell для обозначения схемы типов - PullRequest
1 голос
/ 13 марта 2019

Мне интересно, какие объявления типов Haskell будут соответствовать схеме типов ниже?

∀a, b.H (a → b) ⇒ b

Это из 4.1 Однозначность / A Теория перегрузки


Позже Редактировать после ответа chi . Я опробовал этот код, но не могу заставить его работать как надо

class H f where 
  g :: f -> Bool

instance H (Integer -> Bool) where
  g f = f 0

instance H (Char -> Bool) where
  g f = f '1'

g (\x -> if x > 10 then True else False)

g (\x -> if x == '0' then True else False)

Кроме того, я понял, что для этого кода нельзя сделать тип однозначным, добавив функциональную зависимость, такую ​​как | b -> a, для соответствия этому правилу распространения

(FH) H (a —> b),H (a' —> b) => a = a'

1 Ответ

5 голосов
/ 13 марта 2019

Поскольку H является именем класса типов, оно может допускать несколько экземпляров

instance H (Int -> Bool) where
instance H (Char -> Bool) where
...

В таком случае, если у нас есть термин

x :: ∀a,b. H(a → b) ⇒ b

и нам нужно вычислить

x && True

нам нужно проверить тип x :: Bool, но это определяет только b = Bool, в то время как a = Int и a = Char могут быть использованы.Из-за этого тип неоднозначен.

...