2016-04-22 2 views
1
Expected type: ErrorT String IO Integer 
Actual type: IO (Either String Integer) 

Я понятия не имею, где я ошибаюсь. В конце концов, эти типы изоморфны.
Конечно, когда я заменить мою подпись функции отПочему компилятор сердится на изоморфные типы?

ErrorT String IO Integer 

в

IO (Either String Integer) 

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

+4

компилятор проверяет тип равенства, а не изоморфизм. В противном случае 'newtype' было бы совершенно бесполезно. Кроме того, я бы не хотел «case True of Left() -> 1; Right() -> 2', чтобы ввести проверку. – chi

+2

компилятор и его жена ехали на работу сегодня, когда полицейский остановил их. «Ты знаешь, почему я тебя вытащил», - спрашивает полицейский. Компилятор «Нет офицера» отвечает. «Ты ехал без ремней безопасности». «Вы, должно быть, ошибаетесь, офицер, я его видел!» Они идут туда и обратно о том, был ли ремень безопасности включен в течение нескольких минут. Затем полицейский наклоняется и говорит женщине: «Был ли компилятор без ремня безопасности?» Женщина отвечает: «Офицер, после сорокалетнего брака с компилятором, я узнал одно. Никогда не спорь с ним, когда он пьян!» Компилятор получил билет. Вот почему он злится. – Spade

ответ

4

это немного сложно ответить, потому что нет никакого реального вопроса, но компилятор не устраивает, потому что типы могут быть изоморфного но они не являются синонимами - есть в том, как ErrorT:

newtype ErrorT e m a = ErrorT m (Either e a) 
         ^^^^^^ 

see here

вы уже это еще один из ваших вопросов - это разница между чем-то вроде

return (Left "Hello") :: IO (Either String Integer) 

и

ErrorT (return (Left "Hello")) :: ErrorT String IO Integer 
+0

Да, я спросил об этом, но я до сих пор не понимаю. Тем не менее я делаю небольшой шаг вперед. Можно ли конвертировать из 'IO (Либо String Bool)' в 'ErrorT String IO Bool'? Мне кажется, что добавить (с самого начала) ErrorT –

+1

да точно! - это то, о чем был ваш последний вопрос, если я правильно помню - вам действительно нужно только обернуть его «ErrorT» – Carsten

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