Sjoerd Visscher씨가 함수형 프로그래밍을 위해 사용하는 JavaScript에서 대수적 자료형 생성이 가능한 라이브러리를 작성하셨습니다.

ADT.js는 JavaScript 1.8에서 작성되었습니다. 즉, Firefox 3.0.1 에서만 작동한다는 의미입니다. 코드가 깔끔해지기 때문에 앞으로도 1.8을 계속 유지할 생각인가봅니다. 하지만 ECMAScript v3에서 작동하지 못하게 할 이유도 없으며 또한 Python이나 Ruby에 대해서도 잘될 것이라고 믿어 의심치 않는다고 합니다.

새 라이브러리로 이런 식의 타입을 작성할 수 있습니다(Haskell과 비교해보세요):
[code:js]
// Haskell:
// data Color = Red | Green | Blue | Yellow
// data Point = Pt Float Float Color
Color = Data(function() ({ Red: {}, Green: {}, Blue: {}, Yellow: {} }))
Point = Data(function() ({ Pt: { x: Number, y: Number, color: Color } }))
 
// Haskell:
// data Attrs n v = Attr n v
// data Node  n v = Elem n (List (Attrs n v)) (List (Node n v)) | Text v
Attrs = Data(function(_, n, v) ({ Attr: {name: n, value: v} }))
Node = Data(function(node, n, v) ({
  Elem: { name: n, attributes: List(Attrs(n, v)), childNodes: List(node) },
  Text: v
}))
이 타입으로는 이런 식의 사용이 가능합니다:
[code:js]
// With unfold you can easily generate algebraic data structures from other data. The following example shows how to generate a decreasing list of numbers.
var counter = List.unfold(function(n, c) n ? c.Cons(n, n - 1) : c.Nil)
 
// Fold is the reverse of unfold. It destructs data into a return value. Here is an example that multiplies a list of numbers.
var prod = List.fold({ Nil: 1, Cons: function(h, t) h * t })
 
// With map you provide a function for each type parameter. Here are 2 examples using the XML data types
var addPrefix = Node.map(function (name) "x:" + name, id)
var normalizeSpace = Node.map(id, function (value) value.replace(/^\s+|\s+$/g, ""))
그 외에도 꽤 많습니다.

from Algebraic Data Tyeps in JavaScript
Posted by 행복한고니 트랙백 0 : 댓글 0

댓글을 달아 주세요