Этот вопрос не субъективен. В упомянутой книге используется очень специфический глагол, и я хотел бы понять, каково значение этой фразы, потому что, боюсь, я что-то неправильно понимаю.
Из « 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имеет вид* -> *. Теперь давайте просто заменим эти типы наsomethings, которые мы использовали в качестве заполнителей, и мы увидим, что они имеют вид(* -> *) -> * -> * -> *.
Почему мы вообще что-то предполагаем? После прочтения «мы предполагаем, что X (то есть мы предполагаем, что X истинно)», для меня естественно думать, что мы должны также рассмотреть случай, когда X ложно. В конкретном случае примера не может tбыть добрым (* -> *) -> *и kдобрым (* -> *)? Если бы это было так, то все , что tи на kсамом деле были, по- t kпрежнему будет тип бетона, нет?
Я вижу, что вся цепочка рассуждений затем проверяется с помощью компилятора, но я не думаю, что компилятор предполагает . Если это произойдет, я хотел бы знать, что, если это не так, то, опять же, я боюсь, что мне не хватает значения параграфа.
k :: Lдля любого видаL, покаt :: L -> *. Компилятор здесь, однако, должен выбрать какой-то конкретныйLтип или прибегнуть к поликинду. Поликинд был бы наиболее общим вариантом, но здесь GHC выбираетL = *(базовый Haskell не имеет поликиндов, они должны быть включены как расширение). Поскольку он выбирает что-то довольно произвольное, LYAH использует слово «предположить» (AFAICT).