Кстати о монадологии |
[Apr. 14th, 2016|10:14 pm]
kouzdra
|
Ну когда на хаскеле писал - посмотрел в доки по библиотекам (была мысля на массивы посадить - только не понял как это сделать, так чтобы оно было более осмысленно, чем на списках) - там же всякие правила они пишут типа:
class Functor f where Source
The Functor class is used for types that can be mapped over.
Instances of Functor should satisfy the following laws:
fmap id == id
fmap (f . g) == fmap f . fmap g
The instances of Functor for lists, Maybe and IO satisfy these laws. В хаскеле это все на уровне "на честность программиста" (ну и компилятор про них на сам деле мало чего знает.
А вот во всяких Agda-х и Idris-aх же вроде такое должно формально выражаться. И даже до какой-то степени доказываться. Никто не пробовал т-сть твердую научную основу под это дело подложить? |
|
|
Comments: |
![[User Picture]](https://l-userpic.livejournal.com/100501178/15670634) | From: rdia 2016-04-15 01:23 am (UTC)
| (Link)
|
1. А монады тут при чём?
2. Таки неужели можно это отследить?
3. Если функции f и g чистые, то map f.g = map f.map g - тривиально. Чистоту функций можно с хорошей точностью отследить даже для Цэ-Пэ-Пэ.
Собственно, я не понимаю, почему Цэ-Пэ-Пэ компиляторы не отслеживают это самостоятельно, и не распараллеливают автоматом. И почему нет директивы pure. И, кстати, не понимаю, почему директиву const нужно обязательно ставить ручками.
4. В Хачкеллях вроде бы все функции чистые => утверждение тривиально?
1. Functor - смежный класс
2. Отследить нельзя в общем случае - но можно формализовать и вполне вероятно - проверить доказательство (а Agda и Idris как раз тем и интересны, что в них можно доказательства расписывать)
3. Это тривиально при условии что map - действительно map - что тут как раз частично и постулируется как существенное свойство реализации функтора
![[User Picture]](https://l-userpic.livejournal.com/100501178/15670634) | From: rdia 2016-04-15 04:05 am (UTC)
| (Link)
|
Кстати, возьмём функцию cap: для любых f и g (таких, что существует f.g) и списков lst у нас (cap f.g) == (cap f).(cap g); любая ф-я (cap z) сохраняет длину списка. Можно ли выбрать такую cap, что cap != map? | |