gpt4 book ai didi

javascript - 原生 JavaScript 类型是如何用 Elm 编写的?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:31:52 25 4
gpt4 key购买 nike

原生 JavaScript 类型如何用 Elm 编写?定义 List 的文件非常短且易于阅读:

我很好奇 Elm 如何为 JavaScript 提供类型安全的接口(interface)。 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

这告诉我们 headtail 可以在 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
};

}();

我对 { ctor: '::', _0: hd, _1: tl }; 这行特别好奇,因为 ctor 这个词是functor 这个词——这可能意味着仿函数是用 JavaScript 编写的。


这些考虑很重要,因为我正在考虑编写一个 Tree a 和/或 QuadTree a类型,从 Elm 内部编写(例如使用记录)或编写供个人使用的模块可能会很好。

  • 树的一个实现可以只有节点
  • 另一个可以区分between 节点
  • 另一个只有 4 个无法区分的节点。

另一个例子可能是 CircularList但我现在只想关注树木。

最佳答案

认为 ctor 是“constructor”的缩写,List 只是作为链表实现的。每个节点要么是空列表 ({ ctor: '[]' }),要么由一个值(在 _0)和列表的其余部分(在 _1) 与 '::' 构造函数放在一起。

Ex 列表 [1, 2] 将是 Cons(1, Cons(2, Nil)) 完全扩展将是

{ ctor: '::',
_0: 1,
_1: { ctor: '::',
_0: 2,
_1: { ctor: '[]' } } }

你可以在toArray中看到它正在使用 xs.ctor !== '[]' 来检查它是否已到达列表的末尾,或者它是否应该将头部推到数组并继续前进。

function toArray(xs)
{
var out = [];
while (xs.ctor !== '[]')
{
out.push(xs._0);
xs = xs._1;
}
return out;
}

关于javascript - 原生 JavaScript 类型是如何用 Elm 编写的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38064062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com