Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
1

Воскресные вариадические опыты

06.11.2017, 15:01. Просмотров 349. Ответов 10
Метки нет (Все метки)

Крутил на выходных забавный код:
Haskell
1
2
3
4
5
6
7
8
class SumRes r where 
    sumOf :: Integer -> r
 
instance SumRes Integer where
    sumOf = id
 
instance (Integral a, SumRes r) => SumRes (a -> r) where
    sumOf x = sumOf . (x +) . toInteger
Код
*Main> sumOf 1
1
*Main> sumOf 1 2
3
*Main> sumOf 1 2 3
6
Собственно, несколько вопросов к уважаемому сообществу:
1) Это вообще нормальный подход? Или хакерство/читерство? Насколько так допустимо делать?
2) Есть ли средство нормально посмотреть в динамике, как именно Хаскель эти конструкции раскручивает?

3) В коде существенно использована связь типа Integer с классом Integral, имеющим метод toInteger.
Получается, нужен костыль только из-за того, что, оказывается, нельзя написать явно
Haskell
1
instance (SumRes r) => SumRes (Integer -> r) where
А когда я попытался перенести это, скажем, на Bool, то не придумал ничего лучше, чем завести свой класс:
Haskell
1
2
3
4
class IsBool b where
  toBool b -> Bool
instance IsBool Bool where
  toBool = id
Но это же вообще костыль..
1
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2017, 15:01
Ответы с готовыми решениями:

Вывести все воскресные дни в текущем месяце
Помогите пожалуйста сделать Вывести все воскресные дни в текущем месяце

первые опыты
Увлекся электроникой, спаял первые схемы УНЧ на микросхеме LM386 и светодиодный индикатор уровня...

Мои литературные опыты
Несколько лет назад я неожиданно для себя написал короткий рассказ. А потом пошло-поехало... Пишу...

Опыты измерения и симуляции
Мне нужно провести конкретные опыты, снять с приборов конктретные цифры. Я хотел бы сделать...

Кто нибудь проводил опыты
Есть домен тиц 100 есть сайт с тиц 0 который было бы неплохо закинуть на этот домен, сайт уже в...

10
Curry
3131 / 2145 / 262
Регистрация: 01.06.2013
Сообщений: 4,607
Записей в блоге: 9
06.11.2017, 16:50 2
Цитата Сообщение от Case-Man Посмотреть сообщение
Это вообще нормальный подход?
polyvariadic функции нормальный подход. В модуле Text.Printf используются. Я тоже ими "грешу" https://github.com/KolodeznyDiver/GU...w/PopupMenu.hs

Это вы наверняка читали
https://stackoverflow.com/questions/...skell-function
https://wiki.haskell.org/Varargs
Цитата Сообщение от Case-Man Посмотреть сообщение
Есть ли средство нормально посмотреть в динамике, как именно Хаскель эти конструкции раскручивает?
В отладчике разве что.

Цитата Сообщение от Case-Man Посмотреть сообщение
когда я попытался перенести это, скажем, на Bool, то не придумал ничего лучше, чем завести свой класс
Вы как то хотите объединить Bool с SumRes ? Но у вас же там суммирование. Как суммировать с Bool?
0
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
06.11.2017, 17:00  [ТС] 3
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Вы как то хотите объединить Bool с SumRes ? Но у вас же там суммирование. Как суммировать с Bool?
Я смотрел подход. Делал Xor:
Haskell
1
2
3
4
5
6
7
8
9
10
11
class IsBool b where
  toBool :: b -> Bool
instance IsBool Bool where
  toBool = id
 
class XorRes r where 
    xorOf :: Bool -> r
instance XorRes Bool where
    xorOf = id
instance (IsBool a, XorRes r) => XorRes (a -> r) where
    xorOf x = xorOf . (x /=) . toBool
Вроде как один к одному, а без явного приведения типа не работает:
Код
*Main> xorOf True :: Bool
True
*Main> xorOf True False True :: Bool
False
Код
*Main> xorOf True

<interactive>:1:1: error:
    * Ambiguous type variable `a0' arising from a use of `print'
      prevents the constraint `(Show a0)' from being solved.
      Probable fix: use a type annotation to specify what `a0' should be.
      These potential instances exist:
        instance Show Ordering -- Defined in `GHC.Show'
        instance Show Integer -- Defined in `GHC.Show'
        instance Show a => Show (Maybe a) -- Defined in `GHC.Show'
        ...plus 22 others
        ...plus 11 instances involving out-of-scope types
        (use -fprint-potential-instances to see them all)
    * In a stmt of an interactive GHCi command: print it
0
Catstail
Модератор
25204 / 12869 / 2383
Регистрация: 12.02.2012
Сообщений: 20,990
06.11.2017, 19:34 4
Как я понимаю, это - подход, близкий к continuation?
0
06.11.2017, 19:34
Curry
3131 / 2145 / 262
Регистрация: 01.06.2013
Сообщений: 4,607
Записей в блоге: 9
06.11.2017, 19:55 5
Цитата Сообщение от Case-Man Посмотреть сообщение
Вроде как один к одному, а без явного приведения типа не работает
Для sumOf, если включите предупреждения, они выдаются
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
*Main> sumOf 1 2
 
<interactive>:4:1: warning: [-Wtype-defaults]
    * Defaulting the following constraints to type `Integer'
        (Integral t0) arising from a use of `sumOf' at <interactive>:4:1-9
        (Num t0) arising from the literal `2' at <interactive>:4:9
    * In the expression: sumOf 1 2
      In an equation for `it': it = sumOf 1 2
 
<interactive>:4:1: warning: [-Wtype-defaults]
    * Defaulting the following constraints to type `Integer'
        (Integral t0) arising from a use of `sumOf' at <interactive>:4:1-9
        (Num t0) arising from the literal `2' at <interactive>:4:9
    * In the expression: sumOf 1 2
      In an equation for `it': it = sumOf 1 2
 
<interactive>:4:1: warning: [-Wtype-defaults]
    * Defaulting the following constraints to type `Integer'
        (Show a0) arising from a use of `print' at <interactive>:4:1-9
        (SumRes a0) arising from a use of `it' at <interactive>:4:1-9
    * In a stmt of an interactive GHCi command: print it
3
но, приводятся к Integer.
В общем, нужно явно приводить. Обратите внимание что при реализации поливариадик функций, обычно, в итоге, вызывают не член класса типов, а ещё отдельно сделанную ф-ию.

Добавлено через 7 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Как я понимаю, это - подход, близкий к continuation?
Я не вижу связи. Это чисто compile-time полиморфизм. Функция с одним аргументом возвращает функцию.
Кроме последнего аргумента подходят instance (Integral a, SumRes r) => SumRes (a -> r), а для последнего аргумента instance SumRes Integer. Таким образом компилятор строит цепочку вызовов функций sumOf для разных instance.
0
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
06.11.2017, 21:44  [ТС] 6
А что с костылём по созданию класса IsBool? Есть более красивые решения?
0
Curry
3131 / 2145 / 262
Регистрация: 01.06.2013
Сообщений: 4,607
Записей в блоге: 9
06.11.2017, 21:55 7
Цитата Сообщение от Case-Man Посмотреть сообщение
А что с костылём по созданию класса IsBool?
А зачем вам класс IsBool ? У вас в программе будет несколько булевых типов?
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{-# LANGUAGE FlexibleInstances #-}
 
class XorRes r where 
    xorOf :: Bool -> r
 
instance XorRes Bool where
    xorOf = id
    
instance XorRes r => XorRes (Bool -> r) where
    xorOf x = xorOf . (x /=) 
 
main:: IO ()
main = let b1 = xorOf True 
           b2 = xorOf True False
           b3 = xorOf True False True
       in print [b1,b2,b3 :: Bool]
0
Case-Man
167 / 107 / 22
Регистрация: 02.01.2012
Сообщений: 596
06.11.2017, 22:07  [ТС] 8
А ведь чиал про эту опцию..

А можно чуть подробнее? Правильно ли я понимаю, что режим
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Haskell
1
{-# LANGUAGE FlexibleInstances #-}
включает возможности, не вошедшие в стандарт?

Насколько оправдано? Не опасно ли? Какая тут политика сообщества?
0
Curry
3131 / 2145 / 262
Регистрация: 01.06.2013
Сообщений: 4,607
Записей в блоге: 9
06.11.2017, 22:41 9
Цитата Сообщение от Case-Man Посмотреть сообщение
включает возможности, не вошедшие в стандарт?
Да, {-# LANGUAGE ХХХХХ #-} включает возможности не вошедшие в стандарт.
https://downloads.haskell.org/~ghc/l....html#index-27

Цитата Сообщение от Case-Man Посмотреть сообщение
Насколько оправдано? Не опасно ли? Какая тут политика сообщества?
Посмотрите исходные коды пакетов со stackage.org - используются во множестве.
Есть некоторые опасные расширения , но FlexibleInstances к ним не относится.

https://downloads.haskell.org/~ghc/l...xibleInstances
0
korvin_
2786 / 2057 / 370
Регистрация: 28.04.2012
Сообщений: 6,979
09.11.2017, 00:35 10
Цитата Сообщение от Catstail Посмотреть сообщение
Как я понимаю, это - подход, близкий к continuation?
Нет, ничего общего.
1
Catstail
09.11.2017, 10:52     Воскресные вариадические опыты
  #11

Не по теме:

korvin_, да, я уже понял

0
09.11.2017, 10:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2017, 10:52
Привет! Вот еще темы с ответами:

Опыты с размещением блоков Адсенс
&lt;b&gt;Дано:&lt;/b&gt; 1. Код блоков adsense размещался на одном сайте с постоянной посещаемостью 500...

Школьные опыты с магнитной стрелкой и проводником с током
Есть два стандартных школьных опыта - берется проводник, возле него ставят магнитную стрелку...

Опыты с исходами, не формирующими полную группу событий
Всем привет. Прошу помочь с выводом формулы. Количество исходов некоторого испытания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.