2016-10-18 5 views
0

Я читаю учебник по 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'), не имеет смысла, Фрэнк должен получить * и ->, но если это так, должен быть Фрэнк '' Просто, смысл, но синтаксическая ошибка, я хочу знаете, как этот архив делает работу замещающей модели и проверку синтаксиса.

+0

Обратите внимание, что 'Just 'a'' не является типом, а значением. Как таковой он не имеет никакого вида '*', а типа 'Maybe Char'. В самом деле, как вы писали ниже, вы путаете конструктор типа 'Frank :: * -> (* -> *) -> *' со значением конструктор 'Frank :: b a -> Frank a b'. – chi

ответ

1

О, я понимаю,

Frank a b 

является конструктор типа, значение конструктор

Frank {frankField :: b a} 

так

tofu (Just 'a') = Frank {frankField = Just 'a'} 

вид тип соответствия и заменить модель работы.

Смежные вопросы