Читал Learn You A Haskell For a Great Good! и есть большие проблемы с пониманием экземпляра и рода.
Q1: Значит, тип t
в Tofu t
действует как функция с доброй сигнатурой (* -> (* -> *)) -> *
? И общий добрый знак tofu
- * -> *
, не так ли? поскольку (* -> *) -> *
приводит к *
и (* -> (* -> *)) -> *
тоже
Q2: Когда мы хотим создать Frank a b
экземпляр класса типов Tofu t
, тип данных Frank a b
также должен иметь тот же тип с t
. Это означает, что вид a
это *
, b
* -> *
и b a
, который будет (* -> *) -> *
, что приводит к *
. Это верно?
Q3: x
в tofu x
представляет j a
, поскольку оба имеют вид *
. Frank
с его видом (* -> (* -> *)) -> *
применяется на x
. Но я не уверен, как представление j a
как x
будет различать x
в tofu x
, который равен j a
, и x
в Frank x
, который равен a j
.
Я как бы новичок в идее наличия функции внутри типа или класса данных (например: b
в Frank a b
или t
в Tofu t
), что немного сбивает с толку
Я оставляю ссылку здесь, поскольку цитирование сделает сообщение излишне длинным. ссылка
class Tofu t where
tofu :: j a -> t a j
data Frank a b = Frank {frankField :: b a}
instance Tofu Frank where
tofu x = Frank x
instance Tofu Frank
отсутствует привязка LHS дляt
илиb
. Откуда они берутся? - person AntC   schedule 11.02.2019:kind
, который показывает LYAH, есть также:info
, который сообщает вам все, что GHC знает о ваших именах. Например,:i Tofu
сообщает предполагаемый вид дляt
;:i Frank
сообщает вам предполагаемые виды дляa, b
. - person AntC   schedule 11.02.2019instance
был неправильным. Я исправил это. - person Jung   schedule 11.02.2019tofu
. (Добавьтеderiving Show
в объявление данных дляFrank
.) Записьtofu (Just "hello")
дает неприятные ошибки типа. - person AntC   schedule 11.02.2019