[haskell] Проблема с обобщённым преобразованием
От: thesz Россия http://thesz.livejournal.com
Дата: 22.02.09 01:14
Оценка:
(решил ещё и тут спросить. На #haskell меня что-то проигнорировали.)
Вот код:
module A2 where

import Data.Data

class Size a where
    sizeOf :: a -> Int


Пробуем обобщённый преобразователь:
*A2 Data.Data> :t fmap id . cast
fmap id . cast :: (Typeable a1, Typeable a) => a1 -> Maybe a
*A2 Data.Data> :t fmap show . cast
fmap show . cast :: (Typeable a) => a -> Maybe String
*A2 Data.Data> :t fmap (+1) . cast
fmap (+1) . cast :: (Num a, Typeable a1, Typeable a) =>
                    a1 -> Maybe a
*A2 Data.Data> :t fmap sizeOf . cast

<interactive>:1:14:
    Ambiguous type variable `a' in the constraints:
      `Typeable a' arising from a use of `cast' at <interactive>:1:14-17
      `Size a' arising from a use of `sizeOf' at <interactive>:1:5-10
    Probable fix: add a type signature that fixes these type variable(s)

Почему в последнем случае ошибка? Должно быть, как в случае (fmap show . cast).

Ан нет.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re: [haskell] Проблема с обобщённым преобразованием
От: VoidEx  
Дата: 22.02.09 04:38
Оценка:
Здравствуйте, thesz, Вы писали:

T>Ан нет.


Уже ж в ru_lambda ответили. Ошибка должна быть и там, и там. Ты проверь функцию-то.
Re: [haskell] Проблема с обобщённым преобразованием
От: VoidEx  
Дата: 22.02.09 04:39
Оценка:
Здравствуйте, thesz, Вы писали:

Экспериментальным путём выяснилось, что за дефолт в первом случае берётся ()
ghci> castshow 5
Nothing
ghci> castshow 'a'
Nothing
ghci> castshow ()
Just "()"
Re[2]: [haskell] Проблема с обобщённым преобразованием
От: VoidEx  
Дата: 22.02.09 04:43
Оценка: 4 (1)
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, thesz, Вы писали:


VE>Экспериментальным путём выяснилось, что за дефолт в первом случае берётся ()


В первом случае в ru_lambda.
В приведённом же с (+1) за дефолт берётся Integer. Интересно узнать, почему.
ghci> castP 6
Just 7
ghci> castP (6 :: Int)
Nothing
Re[2]: [haskell] Проблема с обобщённым преобразованием
От: thesz Россия http://thesz.livejournal.com
Дата: 22.02.09 10:15
Оценка:
VE>Экспериментальным путём выяснилось, что за дефолт в первом случае берётся ()
VE>
ghci>> castshow 5
VE>Nothing
ghci>> castshow 'a'
VE>Nothing
ghci>> castshow ()
VE>Just "()"
VE>


Какой ужас, надо сказать. Как же они смогли сделать generic show, тогда?..

Буду думать, что делать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.