(решил ещё и тут спросить. На #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).
Ан нет.
Здравствуйте, thesz, Вы писали:
Экспериментальным путём выяснилось, что за дефолт в первом случае берётся ()
ghci> castshow 5
Nothing
ghci> castshow 'a'
Nothing
ghci> castshow ()
Just "()"
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, thesz, Вы писали:
VE>Экспериментальным путём выяснилось, что за дефолт в первом случае берётся ()
В первом случае в ru_lambda.
В приведённом же с (+1) за дефолт берётся Integer. Интересно узнать, почему.
ghci> castP 6
Just 7
ghci> castP (6 :: Int)
Nothing
VE>Экспериментальным путём выяснилось, что за дефолт в первом случае берётся ()
VE>ghci>> castshow 5
VE>Nothing
ghci>> castshow 'a'
VE>Nothing
ghci>> castshow ()
VE>Just "()"
VE>
Какой ужас, надо сказать. Как же они смогли сделать generic show, тогда?..
Буду думать, что делать.