LINUX.ORG.RU

История изменений

Исправление 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, :

спать поря мне было, ща поробую сделать поаккуратнее свой вариант.