История изменений
Исправление qnikst, (текущая версия) :
спать поря мне было, ща поробую сделать поаккуратнее свой вариант.
там тупо Sup a b ~ d было забыто, хотя я не уверен, что в сложных случаях настолько полиморфная функция выведется и придётся прокси делать. Если заменить на liftS2 :: (Sup a b ~ с,Up a c, Up b c) => (c -> c -> d) -> a -> b -> d
, то будет проще.
По поводу up, скорее всего этот класс не стоит экспортировать и использовать явно, т.к. если он спрятан за Sup, то всё должно быть хорошо.
А так ещё круче:
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-}
import Data.Word
class Up a b where
up :: a -> b
-- cheating
instance (Sup a b ~ b,Integral a, Integral b) => Up a b where up = fromIntegral
проверка
λ> up (2^63 - 1 + 1 :: Integer) :: Int
<interactive>:13:1:
Couldn't match type `Sup Integer Int' with `Int'
Исправление qnikst, :
спать поря мне было, ща поробую сделать поаккуратнее свой вариант.
там тупо Sup a b ~ d было забыто, хотя я не уверен, что в сложных случаях настолько полиморфная функция выведется и придётся прокси делать. Если заменить на liftS2 :: (Sup a b ~ с,Up a c, Up b c) => (c -> c -> d) -> a -> b -> d
, то будет проще.
По поводу up, скорее всего этот класс не стоит экспортировать и использовать явно, т.к. если он спрятан за Sup, то всё должно быть хорошо.
А так ещё круче:
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, UndecidableInstances #-}
import Data.Word
class Up a b where
up :: a -> b
-- cheating
instance (Sup a b ~ b,Integral a, Integral b) => Up a b where up = fromIntegral
Исправление qnikst, :
спать поря мне было, ща поробую сделать поаккуратнее свой вариант.
там тупо Sup a b ~ d было забыто, хотя я не уверен, что в сложных случаях настолько полиморфная функция выведется и придётся прокси делать. Если заменить на liftS2 :: (Sup a b ~ с,Up a c, Up b c) => (c -> c -> d) -> a -> b -> d
, то будет проще.
По поводу up, скорее всего этот класс не стоит экспортировать и использовать явно, т.к. если он спрятан за Sup, то всё должно быть хорошо.
Исправление qnikst, :
спать поря мне было, ща поробую сделать поаккуратнее свой вариант.
там тупо Sup a b ~ d было забыто, хотя я не уверен, что в сложных случаях настолько полиморфная функция выведется и придётся прокси делать. Если заменить на liftS2 :: (Sup a b ~ с,Up a c, Up b c) => (c -> c -> d) -> a -> b -> d
, то будет проще.
Исходная версия qnikst, :
спать поря мне было, ща поробую сделать поаккуратнее свой вариант.