Какие языки поддерживают написание вещей один раз? - PullRequest
3 голосов
/ 21 октября 2011

В качестве примера мы ожидаем, что мы можем определить sum для сущностей типа OrderedCollection [Monoid] , где Monoid - признак / интерфейс с ассоциативнымоперация с нуля.Тогда нам не нужно вырезать и вставлять код для sum , чтобы использовать его.Но типы могут быть моноидами несколькими способами: например, положительными целыми числами с + и 0 или с * и 1. Я не могу найти хороший способ справиться с этим.

Ответы [ 2 ]

1 голос
/ 27 октября 2011

У Haskell есть хороший трюк для обработки множества моноидов с помощью языковой функции newtype:

http://blog.sigfpe.com/2009/01/haskell-monoids-and-their-uses.html (читается из «Один и тот же тип может вызывать моноид по-разному.»)

http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Monoid.html#3 (официальная документация по библиотечно-аддитивным и мультипликативным моноидам для чисел).

0 голосов
/ 03 марта 2012

Конечно, вам нужно четко указать, какую операцию вы хотите использовать?Я не вижу ни одного разумного способа избежать этого.

В Clojure я бы просто использовал функцию высшего порядка:

(defn sum-with [op]
  (fn [coll] 
    (reduce op coll)))

Тогда вы могли бы сделать:*

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...