Я читаю учебник по haskell, когда читаю тип типа системы, я не могу использовать модель замены, чтобы выяснить, как выполнить функцию.Реализация функции Haskell зависит от вида?
class Tofu t where
tofu :: j a -> t a j
data Frank a b = Frank {frankField :: b a} deriving (Show)
instance Tofu Frank where
tofu = Frank
Я могу понять, J имеет тип * -> *, т имеет тип * -> (* -> *) -> *, и Франк рода * -> (* -> *) -> * , матч т, так что можно экземпляр тофу Frank, но реализация тофу позвольте мне смущать, если я делаю как этот
tofu (Just 'a') :: Frank Char Maybe
(Just 'а') рода *, просто * -> *, матч Ja, я использовать замену модели, Фрэнк (Just 'a'), не имеет смысла, Фрэнк должен получить * и ->, но если это так, должен быть Фрэнк '' Просто, смысл, но синтаксическая ошибка, я хочу знаете, как этот архив делает работу замещающей модели и проверку синтаксиса.
Обратите внимание, что 'Just 'a'' не является типом, а значением. Как таковой он не имеет никакого вида '*', а типа 'Maybe Char'. В самом деле, как вы писали ниже, вы путаете конструктор типа 'Frank :: * -> (* -> *) -> *' со значением конструктор 'Frank :: b a -> Frank a b'. – chi