首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >原生JavaScript类型是如何用Elm编写的?

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

Stack Overflow用户
提问于 2016-06-27 14:15:56
回答 2查看 303关注 0票数 4

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

我很好奇Elm是如何证明JavaScript的类型安全接口的。JavaScript是手工编写的,还是从Haskell之类的另一种语言编译而来的?

Elm's List

榆树的关键似乎是..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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中与构造函数相关的一些关键行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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函子这个词的下半部分--这可能意味着函子是用JavaScript写的。

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

  • 树的一个实现可能只是有节点。
  • 另一种方法可以区分在两者之间 节点。
  • 另一个只有4不可区分的节点。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-28 03:30:18

我的直觉是,List的实现是用Javascript编写的,主要是因为它的构造函数是[]::,但是Elm不允许infix操作符作为构造函数名。

例如,我们在Elm中使用List的方式意味着定义实际上应该如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type List a = ([]) | (::) a (List a)

即使我们在这些构造函数上进行模式匹配,也不能在Elm中编译,因此使用了使用Javascript定义实现的快捷方式。

如果使用不同的名称编写自己的自定义列表实现,则javascript输出与List的javascript实现相同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
type MyList a = MyNil | MyCons a (MyList a)

..。产量..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var _user$project$Temp1467112617033056$MyCons = F2(
  function (a, b) {
    return {ctor: 'MyCons', _0: a, _1: b};
  });
var _user$project$Temp1467112617033056$MyNil = {ctor: 'MyNil'};

因此,我看不出有什么理由可以让您建议的TreeQuadTree类型从编写一个原生javascript模块中获益。我建议你用榆树写。

票数 2
EN

Stack Overflow用户

发布于 2016-06-27 15:57:54

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

例如,列表[1, 2]将是Cons(1, Cons(2, Nil)),它将完全扩展为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ ctor: '::',
  _0: 1,
  _1: { ctor: '::',
        _0: 2,
        _1: { ctor: '[]' } } }

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function toArray(xs)
{
    var out = [];
    while (xs.ctor !== '[]')
    {
        out.push(xs._0);
        xs = xs._1;
    }
    return out;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38064062

复制
相关文章
ASP.NET AJAX(5)__JavaScript原生类型以及Microsoft AJAX Library什么是Microsoft AJAX LibraryObject原生类型Object.pro
什么是Microsoft AJAX Library ASP.NET AJAX的客户端部分 纯客户端框架 提供了JavaScript扩展和基础类库 Object原生类型 ECMAScript Spec中定义:一个无序的集合,可以存放任意类型的对象 常作为字典使用 可以使用for-in遍历字典中的每一项 禁止扩展其prototype对象 Miicrosoft AJAX Library并没有扩展Object 类型 Object.prototype toString()/toLocalString()   得到表示
小白哥哥
2018/03/07
1.3K0
你应该知道的7 个 JavaScript 原生错误类型
我们有一个数组,带有两个元素的 arr。接下来,尝试将数组扩展为包含 90**99 == 2.9512665430652753e+193 个元素。
疯狂的技术宅
2020/03/13
2.7K0
js原生判断是否是数字类型[通俗易懂]
最近在写代码的时候,有些逻辑需要判断数字类型,等用到的时候才发现自己了解的方法不太严密,然后就决心查资料汇总了解下有哪些方法比较严密
全栈程序员站长
2022/09/07
9.6K0
如何用原生 javascript 写一个选项卡?
当时学习jquery的时候,是以写一个 选项卡 为开始的。当然,用jq写是非常简单的。
FungLeo
2022/11/28
4520
【说站】Javascript如何用原型对象继承父类型
1、将子类所共享的方法提取出来,让子类的prototype 原型对象 = new 父类()。子类原型对象等于是实例化父类。
很酷的站长
2022/11/24
3420
【说站】Javascript如何用原型对象继承父类型
如何用 JavaScript 编写你的第一个单元测试
测试代码是确保代码稳定的第一步。能做到这一点的最佳方法之一就是使用单元测试,确保应用程序中的每个较小的功能都按应有的方式运行——尤其是当应用程序接收到极端或无效输入,甚至可能有害的输入时。
茶无味的一天
2022/11/01
1.2K0
如何用 JavaScript 编写你的第一个单元测试
如何用 JavaScript 编写你的第一个单元测试
测试代码是使代码安全的第一步。做到这一点的最好方法之一是使用单元测试,确保应用程序中的每个小功能都能发挥其应有的作用--特别是当应用程序处于边缘情况,比如无效的输入,或有潜在危害的输入。
chuckQu
2023/02/13
9180
如何用 JavaScript 编写你的第一个单元测试
如何用sublime优雅的编写processing
由于最近需要调试电机,通过串口通信一行一行的发数字有点太不优雅,所以最好的交互方法是有一个图形化的上位机,直接用鼠标拖动。所以就想用processing撸一个简单的控制器,但是自己实在受不了完全不带代码补全功能的原生IDE。
UDM Lab
2020/04/20
7630
JavaScript 技术篇-js检测原生对象类型实例演示,js的3种对象类型
判断依据一: myArray.constructor 可以返回对象的内部构造函数,除了 Date 和 Array 对象外,其余的都是 Object 对象,但是 constructor 是可以被改变,所有可能会判断有误。
小蓝枣
2020/09/24
2K0
JavaScript 技术篇-js检测原生对象类型实例演示,js的3种对象类型
编写可维护的JavaScript
• 在方法中的局部变量(local variable)和第一条语句之间
硬核项目经理
2019/08/07
8630
JavaScript 原生函数
通过构造函数(如 new String("abc") )创建出来的是封装了基本类型值(如 "Hello" )的封装对象。
Cellinlab
2023/05/17
2680
JavaScript 类型 — 重学 JavaScript
JavaScript 中最小的结构,同学们已知的有什么呢?我想同学们都应该会想到一些东西,比如一些关键字,数字 123,或者 String 字符等等。这里我们从最小的单位,字面值和运行时类型开始讲起。
三钻
2020/10/29
1.7K0
JavaScript 类型 — 重学 JavaScript
JavaScript的类型转换
Undefined n/a undefined (n/a not applicable 不适用)
小小鱼儿小小林
2020/06/24
7450
编写可测试的JavaScript代码
既然要对代码进行测试,那么为什么不让这一过程变得尽可能简单和轻松呢?JavaScript客户端代码测试之所以尤其困难,是因为我们几乎无法控制代码运行的环境。多种类型的操作系统、多个版本的操作系统、多种类型的浏览器、多个版本的浏览器,更不用说插件、扩展、多语言版本和缩放大小了,还有一些未知内容,所有这些因素交织在一起,阻碍着应用程序的性能。这些因素会导致程序变慢、中断、崩溃,最终覆灭。
用户8983410
2021/10/07
4310
编写可测试的JavaScript代码
①使用敏捷开发,并不一定意味着应用程序完成得更快且质量更高,敏捷开发最大的优势是它处理需求变更的方式。
硬核项目经理
2019/08/06
1.4K0
怎样编写更好的 JavaScript 代码[每日前端夜话0xA4]
我看到没有多少人谈论改进 JavaScript 代码的实用方法。以下是我用来编写更好的 JS 的一些顶级方法。
疯狂的技术宅
2019/08/09
1.3K0
怎样编写更好的 JavaScript 代码[每日前端夜话0xA4]
「  1.JavaScript的编写位置:  」
one day {dotted startColor="#ff6c6c" endColor="#1989fa"/}
青益
2023/01/03
2630
如何编写漂亮的 JavaScript 代码
这是一条编程领域流传久远的规则。严格遵守这条规则会让你的代码可读性更好,也更容易重构。如果违反这个原则,那么代码会很难被测试或者重用。
小鑫
2022/02/23
7970
什么是诺如病毒?感染诺如病毒的症状以及预防措施
诺如病毒最初是1968年,在美国俄亥俄州诺沃克市的一所学校爆发的胃肠炎疫情中被发现的。被命名“诺沃克病毒”后改为“诺如病毒”。研究表明,这次疫情的源头是污染了饮用水的污水处理系统,这导致了病毒在学校中的传播。从那以后,诺如病毒在全球范围内广泛传播。
zairun
2023/02/21
4600
点击加载更多

相似问题

如何用ELM编写List.partition函数的模糊测试?

19

什么是“原生JavaScript"?

94

如何用原生javascript制作`groupBy`

21

类型记录:默认导出和名称空间双重行为,如Elm

15

Elm的类型定义

17
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文