【发布时间】:2016-06-27 22:15:56
【问题描述】:
如何在 Elm 中编写原生 JavaScript 类型?定义List 的文件出奇地简短易读:
我很好奇 Elm 如何证明 JavaScript 的类型安全接口。 JavaScript 是手工编写的,还是从 Haskell 等其他语言编译而来的?
Elm 的List 类型
Elm 的主线好像是……
module List exposing
( isEmpty, length, reverse, member
, head, tail, filter, take, drop
, repeat, (::), append, concat
)
import Basics exposing (..)
import Maybe
import Maybe exposing ( Maybe(Just,Nothing) )
import Native.List
(::) : a -> List a -> List a
(::) = Native.List.cons
infixr 5 ::
head : List a -> Maybe a
head list =
case list of
x :: xs ->
Just x
[] ->
Nothing
tail : List a -> Maybe (List a)
tail list =
case list of
x :: xs ->
Just xs
[] ->
Nothing
这告诉我们head和tail可以在Elm中定义,但(::)操作必须用JavaScript定义。以下是 JavaScript 中与构造函数有关的一些关键行:
var _elm_lang$core$Native_List = function() {
var Nil = { ctor: '[]' };
function Cons(hd, tl) { return { ctor: '::', _0: hd, _1: tl }; }
...
return {
Nil: Nil,
Cons: Cons,
// etc
};
}();
我对@987654333@这一行特别好奇,因为ctor这个词是functor这个词的后半部分——这可能意味着一个functor是用JavaScript编写的.
这些考虑因素很重要,因为我正在考虑编写 Tree a 和/或 QuadTree a 类型,从 Elm 内部编写(例如使用 Records)或编写供个人使用的模块可能会很好。
- 树的一种实现可能只有节点
- 另一个可以区分between 左和右节点
- 另一个只有 4 个无法区分的节点。
另一个例子可能是CircularList,但我现在只想专注于树木。
【问题讨论】:
标签: javascript tree functor elm algebraic-data-types