Этот вопрос не субъективен. В упомянутой книге используется очень специфический глагол, и я хотел бы понять, каково значение этой фразы, потому что, боюсь, я что-то неправильно понимаю.
Из « Learn You a Haskell» следующий абзац третий и последний содержит «мы предполагаем *
».
data Barry t k p = Barry { yabba :: p, dabba :: t k }
И теперь мы хотим сделать это примером
Functor
.Functor
хочет типа,* -> *
ноBarry
не выглядит так, как у него Что это за видBarry
? Ну, мы видим, что он принимает три параметра типа, так что будетsomething -> something -> something -> *
. Можно с уверенностью сказать, чтоp
это конкретный тип и, следовательно, имеет своего рода*
. Ибоk
, как мы предполагаем,*
и так по расширению,t
имеет вид* -> *
. Теперь давайте просто заменим эти типы наsomething
s, которые мы использовали в качестве заполнителей, и мы увидим, что они имеют вид(* -> *) -> * -> * -> *
.
Почему мы вообще что-то предполагаем? После прочтения «мы предполагаем, что X (то есть мы предполагаем, что X истинно)», для меня естественно думать, что мы должны также рассмотреть случай, когда X ложно. В конкретном случае примера не может t
быть добрым (* -> *) -> *
и k
добрым (* -> *)
? Если бы это было так, то все , что t
и на k
самом деле были, по- t k
прежнему будет тип бетона, нет?
Я вижу, что вся цепочка рассуждений затем проверяется с помощью компилятора, но я не думаю, что компилятор предполагает . Если это произойдет, я хотел бы знать, что, если это не так, то, опять же, я боюсь, что мне не хватает значения параграфа.
k :: L
для любого видаL
, покаt :: L -> *
. Компилятор здесь, однако, должен выбрать какой-то конкретныйL
тип или прибегнуть к поликинду. Поликинд был бы наиболее общим вариантом, но здесь GHC выбираетL = *
(базовый Haskell не имеет поликиндов, они должны быть включены как расширение). Поскольку он выбирает что-то довольно произвольное, LYAH использует слово «предположить» (AFAICT).