Выяснение декларации типа для HOF в Haskell - PullRequest
0 голосов
/ 29 марта 2019

Я готовлюсь к экзамену, и одна из проблем на практике требует написать объявление типа

mystery :: ---complete here---- 
mystery x p
    | p (head x) = tail x
    | otherwise  = head x : mystery (tail x) p

Не глядя на ответ, я подумал, что тайна будет иметь тип:

mystery:: [a] -> a -> [a]

но когда я смотрю на решение для сравнения:

mystery:: [a] -> (a -> Bool) -> [a]

Почему a -> Bool?и что в строках кода может сказать мне рассмотреть Bool в моем объявлении типа?

1 Ответ

7 голосов
/ 29 марта 2019

Вот что мы знаем о p:

  1. Оно применяется к значению, поэтому оно должно быть функцией.Это делает его типом t1 -> t2 для некоторых типов t1 и t2.
  2. Он специально применяется к head x.Поскольку вы уже определили, что x :: [a], то head x :: a.Это означает t1 ~ a, и поэтому p :: a -> t2.
  3. p (head x) используется в контексте, где ожидается логическое значение, поэтому p (head x) :: Bool.Это означает t2 ~ Bool и т. Д. p :: a -> Bool.

QED.

...