Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2016-07-04

Scala Type Classes

Что-то поперло про type classes, просто поперло.
Только на днях я упоминал зачетные слайды https://speakerdeck.com/raulraja/typeclasses-tour

Не прошло и недели, как мне попадается изумительный материал про тайп классы

Настолько все доступно изложено, что даже я всё понял.
И применил на практике:
// type classes example
// based on material from SICP 1.3.1 high-order procedures
// inspired by
// The Neophyte's Guide to Scala Part 12: Type Classes
// http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes.html
// scala.math.Numeric is a type class
// that define an interface
// abstract numeric increment (can be int, can be double)
def inc[T : Numeric](x: T) = implicitly[Numeric[T]].plus(x, implicitly[Numeric[T]].one)
// one way to access an implicit value
// abstract numeric cube
def cube[T](x: T)(implicit ev: Numeric[T]) = ev.times(x, ev.times(x, x))
// another way to access
// abstract sum for abstract sequence
def sum[T](op: T => T,
a: T,
next: T => T,
b: T)
(implicit ev: Numeric[T]): T = {
if (ev.gt(a, b)) ev.zero
else ev.plus(op(a), sum(op, next(a), next, b))
}
// int
def sumCubes(a: Int, b: Int): Int = sum[Int](cube[Int], a, inc[Int], b)
sumCubes(1, 10) // 3025
def sumIntegers(a: Int, b: Int): Int = sum[Int](identity, a, inc[Int], b)
sumIntegers(1, 10) // 55
// double
def piterm(x: Double): Double = 1.0 / (x * (x + 2))
def pinext(x: Double): Double = x + 4
def piSum(a: Int, b: Int): Double = sum[Double](piterm, a, pinext, b)
piSum(1, 1000) * 8 // 3.139
// or, you can cast int to double and forget about Numeric type class
def alldouble() = {
def cube(x: Double): Double = x * x * x
def inc(n: Double): Double = n + 1
def sum(op: Double => Double,
a: Double,
next: Double => Double,
b: Double): Double = {
if (a > b) 0
else op(a) + sum(op, next(a), next, b)
}
def sumCubes(a: Int, b: Int) = sum(cube, a, inc, b)
println(sumCubes(1, 10)) // 3025.0
def sumIntegers(a: Int, b: Int) = sum(identity, a, inc, b)
println(sumIntegers(1, 10)) // 55.0
def piterm(x: Double): Double = 1.0 / (x * (x + 2))
def pinext(x: Double): Double = x + 4
def piSum(a: Int, b: Int) = sum(piterm, a, pinext, b)
piSum(1, 1000) * 8 // 3.139
}
alldouble()

Идея очень проста и отвечает на запрос: как нам облегчить ad-hoc polymorphism в системах со строгой типизацией? Нужно абстрагировать некий алгоритм, повысить степень DRY.

Ну как, делаем интерфейс, реализуем алгоритм в терминах этого интерфейса. Реализацию интерфейса подмешиваем в нужный класс – опля, этот класс можно пихать в упомянутый алгоритм.
Проверка типов в Scala делается через implicit переменные.


Повторюсь: как же люди без дактайпинга мучаются. Зато всё под контролем.




original post http://vasnake.blogspot.com/2016/07/scala-type-classes.html

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) humor (23) Java (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Klaipeda (15) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) Baltic (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) seaside (1) serialization (1) shore (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)