|
|
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
вот проблема: ZyK_BotaNZyK_BotaNче-то мне система типов хаскеля дала по рукам, и не позволила мне реализовать проблему квадрата_прямоугольника так, как я это делал на с++ кстати, вспомнил почему. недавно же читал про ограничения системы типов хаскеля, на примере Функтора. то что в хаскеле называется Функтором, на самом деле является ЭндоФунктором, а настоящий Функтор, так просто не реализуешь, так как хаскель типизируется по хиндли-милнеру(что обеспечивает автоматический вывод типов) что-бы понять суть, покажу, то как я хотел реализовать, и почему не получилось. хотел сделать так(не нарушая принцип лисков): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. Код: plaintext 1. 2. вот если бы хаскель позволял сделать такую сигнатуру - (r1 a -> a -> r2 a) - где r1 и r2 - типы класса Rectangle, то все бы выше. но из-за возможности вывода типов, данные возможности у хаскеля убрали(но я попробую как-то эту проблему решить) но где-то проскакивала ссылка, где данную проблему решали для реализации функтора. если я найду, то перепишу пример для квадрата и прямоугольника. λf.(λx.f (x x)) (λx.f (x x)) пуду по ходу решения проблемы, оставлять здесь комментарии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 21:57 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
вот что я нашел на данную тему в в журнале ПФП: авторПолиморфизм ранга * (rank * polymorphism) — вместо символа подстановки * могут использоваться значения «1», «k» и «N». В полиморфизме первого ранга (этот тип полиморфизма ещё называют «предварённым полиморфизмом» или «let-полиморфизмом») типовые переменные могут получать конкретные значения мономорфных типов. Полиморфизм ранга k предполагает, что в формулах, описывающих λ-термы, квантор всеобщности (∀) может стоять не более чем перед k стрелками. Данный класс полиморфизма выделен потому, что при k = 2 проблема вывода типов разрешима, в то время как при k > 2 эта проблема неразрешима. Наконец, полиморфизм высшего ранга (или полиморфизм ранга N) определяется тем, что кванторы всеобщности могут стоять перед произвольным количеством стрелок. в системе по хиндли-милнеру используется let полиморфизм. т.е. первого ранга. я думаю нужно сюда копать. как сделать полиморфизм 2-го ранга. возможно есть расширения для компилятора, которіе позволяют єто сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 21:59 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
вот что мне рассказал анонимус с лора: авторПроявлю смелость предположить, что вопрос сформулирован криво и (f :: a1 -> b -> a2) требуется по a2 экзистенциальным, а не полиморфным. В таком случае есть как минимум два выхода: мультипараметрические классы типов с функциональными зависимостями или семейства типов. Раз. class C a1 a2 | a1 -> a2 where f :: a1 -> b -> a2 data T1 = T1 data T2 = T2 instance C T1 T1 where f T1 b = T1 instance C T2 T1 where f T2 b = T1 Два. class C a1 where type F a1 f :: a1 -> b -> F a1 data T1 = T1 data T2 = T2 instance C T1 where type F T1 = T1 f T1 b = T1 instance C T2 where type F T2 = T1 f T2 b = T1 anonymous (05.10.2011 22:18:18) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 22:21 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaN, Какие _вещества_ употребляем на нось глядя? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 22:53 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
ЗимарглZyK_BotaN, Какие _вещества_ употребляем на нось глядя? жигулевское ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 22:54 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
нет в квадрате ширины и высоты есть длина стороны. писать для квадрата отдельно функции setWidth и setHeight - глупость изначально ;) . даже с точки зрения интерфейса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:02 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneнет в квадрате ширины и высоты есть длина стороны. писать для квадрата отдельно функции setWidth и setHeight - глупость изначально ;) . даже с точки зрения интерфейса. дак они как раз для того, что-бы можно было смотреть на квадрат, считая его прямоугольником. так-то. з.ы. благодяря анонимусу с лора, запилил работающую версию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. правда, что-бы она заработала, нужно использовать ghc-расширение - "-XTypeFamilies" стандарт 98-го года, не позволяет так делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:09 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneнет в квадрате ширины и высоты есть длина стороны. писать для квадрата отдельно функции setWidth и setHeight - глупость изначально ;) . даже с точки зрения интерфейса. дак они как раз для того, что-бы можно было смотреть на квадрат, считая его прямоугольником. так-то. з.ы. благодяря анонимусу с лора, запилил работающую версию: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. правда, что-бы она заработала, нужно использовать ghc-расширение - "-XTypeFamilies" стандарт 98-го года, не позволяет так делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:09 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
дак они как раз для того, что-бы можно было смотреть на квадрат, считая его прямоугольником. так-то. а зачем? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:11 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneнет в квадрате ширины и высоты есть длина стороны. писать для квадрата отдельно функции setWidth и setHeight - глупость изначально ;) . даже с точки зрения интерфейса. заметь. вот интерфейс квадрата: Код: plaintext 1. 2. 3. здесь нет ширины и высоты. но так как квадрат является прямоугольником, то мы говорим, что тип s можно сделать инстасом калсса Квадрат, только если тип s - является инстансом класса прямоугольник ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:11 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneдак они как раз для того, что-бы можно было смотреть на квадрат, считая его прямоугольником. так-то. а зачем? :) есть у меня алгоритм для прямоугольника. есть квадрат. хочу применить данный алгоритм для моего объекта. квадрат ведь является прямоугольником, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:12 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
ну ладно есть такие свойсвта прямоугольника как высота и длина. это его унутрениие свойства а почему мартин пытается вычислить площадь снаружи ? нужна ему площадь - пусть описывает это свойтсво внутри объекта. а из-за двойных стандартов все проблемы и есть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:18 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
нет я точно также могу определить его как равносторонний равноугольный многоугольник с четырьмя сторонами. тогда наследовать я его буду от другого базового класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:20 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneну ладно есть такие свойсвта прямоугольника как высота и длина. это его унутрениие свойства а почему мартин пытается вычислить площадь снаружи ? нужна ему площадь - пусть описывает это свойтсво внутри объекта. а из-за двойных стандартов все проблемы и есть :) ну в данном случае проблемы с площадью нет. можно смело снаружи считать. так как у квадрата есть и ширина и высота: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:24 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneнет я точно также могу определить его как равносторонний равноугольный многоугольник с четырьмя сторонами. тогда наследовать я его буду от другого базового класса. внезапно. кто тебе мешает сделать квадрат еще и раносторониим и равно угольным многоугольником? хочешь? - делай. при этом одно другому не мешает. он все так же будет оставаться прямоугольником. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:25 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNU-geneнет я точно также могу определить его как равносторонний равноугольный многоугольник с четырьмя сторонами. тогда наследовать я его буду от другого базового класса. внезапно. кто тебе мешает сделать квадрат еще и раносторониим и равно угольным многоугольником? хочешь? - делай. при этом одно другому не мешает. он все так же будет оставаться прямоугольником. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. пример пойдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:32 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
вот полный код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2011, 23:46 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
ключевые слова - квадрат выглядит как прямоугольник поэтому мы можем к нему применить алгоритм как к прямоугольнику но не изменить стороны, как у прямоугольника если бы было два типа наследования 1) IS наследование, когда наследуется все и 2) LOOKS_LIKE наследование когда наследуются только get часть спецификации а затем писать что-то типа void LSPV( readonly Rectangle& r){ r.SetWidth(5); // ошибка компилятора, потому что это set-метод assert(r.GetWidth() * r.GetHeight()) == 20); } то это бы в некоторой степени решило проблему. наверно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 00:04 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneключевые слова - квадрат выглядит как прямоугольник поэтому мы можем к нему применить алгоритм как к прямоугольнику но не изменить стороны, как у прямоугольника бинго. функция setWidth - возвращает прямоугольник если хочешь изменить сторону квадрата, нужно юзать setSide но при этом, квадрат наследуется от прямоугольника, поэтому ф-ю setWidth можно применить к квадрату(ну и получить прямоугольник). что и видно из моего кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 00:08 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-genevoid LSPV( readonly Rectangle& r){ r.SetWidth(5); // ошибка компилятора, потому что это set-метод assert(r.GetWidth() * r.GetHeight()) == 20); } то это бы в некоторой степени решило проблему. наверно нет. проблему решают иммутабешьные типы. когда setWidth, не объект изменяет, а возвращает новый измененный объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 00:10 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneключевые слова - квадрат выглядит как прямоугольник а тут ты полностью неправ. квадрат является прямоугольником, по определению. т.е. множество квадратов входит в множество прямоугольников. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 00:18 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
когда setWidth, не объект изменяет, а возвращает новый измененный объект это не понял. ну вернет оно измененный объект что - площадь правильно посчитается? т.е. множество квадратов входит в множество прямоугольников. это оно по геометрии входит, кторая позваоляет всякие какб очевидные человеческому мозгу абстракции и упрощения и мы тут по системы трем, где всё рукой прописывать надо по get интерфейсу оно входит в множество прямоугольников а по set интерфейсу оно входит в множество центрально-симметричных многоугольников. умартина пример логической ошибки, когда код вроде бы правильный, а результат кривой существуют внутренние зависимости, когда изменение некоторого компонента объекта влечет изменение другого компонента. мне кажется, что любое изменение такой зависимости в процессе наследования потенциально ведет к ошибке, как у мартина любое! если мы позволим себе LOOKS_LIKE наследование (только get-интерфейс) и затем будем пресекать для таких объектов использование чужих set-интерфейсов, то проблема будет ловиться на этапе компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 09:28 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneкогда setWidth, не объект изменяет, а возвращает новый измененный объект это не понял. ну вернет оно измененный объект что - площадь правильно посчитается? да ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 10:52 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneа по set интерфейсу оно входит в множество центрально-симметричных многоугольников. да не кривой же результат. все нормально. просто setWidth - возвращает прямоугольник(а не квадрат) - так как этот метод объявлен в интерфейсе прямоугольника. если хочешь изменить сторону квадрата, юзай метод квадрата setSide. вообще, зачем делать квадрат наследником прямоугольника? что-бы любой алгоритм для прямоугольника мог работать с квадратом. а вот теперь скажи. какой алгоритм с ним работать не будет? вот с площадью все ок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 10:55 |
|
||
|
[haskell] ограничение системы типов хаскеля.
|
|||
|---|---|---|---|
|
#18+
U-geneесли мы позволим себе LOOKS_LIKE наследование (только get-интерфейс) и затем будем пресекать для таких объектов использование чужих set-интерфейсов, то проблема будет ловиться на этапе компиляции. почему же только гет? и сет нужно наследовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2011, 10:56 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=37470187&tid=1342685]: |
0ms |
get settings: |
4ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
818ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 1098ms |

| 0 / 0 |
