首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从功能上思考。在Haskell / Purescript中构建一个新的数组

从功能上思考。在Haskell / Purescript中构建一个新的数组
EN

Stack Overflow用户
提问于 2017-01-14 07:25:58
回答 1查看 482关注 0票数 5

我刚开始使用函数式编程,我决定在Purescript中构建一个应用程序。我遇到了我的第一个障碍,我不知道如何从概念上考虑这个问题。

我找的不是代码,而是从功能上思考这个问题的方法。

我有一份数据清单。具体来说,就像

代码语言:javascript
复制
[ {a :: String, b :: String, c :: String} ]

我希望使用提供的记录(带有上述类型的列表)创建Html列表(这是purescript-halogen类型)。

所以,我会有个功能

代码语言:javascript
复制
buildElements :: forall p i. MyRecordObject -> Array (HTML p i)

现在,我想我需要给这个函数结果类型一个Monad计算上下文(purescript Eff就像Haskell IO)

所以,就像:

代码语言:javascript
复制
buildElements :: forall p i. MyRecordObject -> Eff (Array (HTML p i))

我的第一个想法是模糊地创建一个清单,其中包括

代码语言:javascript
复制
take $ length xs $ repeat ARecordObject

然后将记录映射到列表上,但我并不确定如何将其转换为代码。无论如何,这似乎都是错误的,因为我的计划涉及改变ARecordObject的状态,这是不可能的。

所以我找到了这个函数:

代码语言:javascript
复制
forEach :: forall e a. Array a -> (a -> Eff e Unit) -> Eff Unit

看起来差不多完美了!我得到一个数组,我给它一个函数,以某种方式将记录中的属性分配给这个新的array...but no,等等……我又在考虑非功能了。

我真的有点不知所措。基本上,我想要创建一个类似于<li></li>元素的列表,其中我为每个项分配属性。

E.g

为我提供了一份记录:

代码语言:javascript
复制
[ { id: "id1", name: "name1", class: "class1", content: "content1" }
, { id: "id2", name: "name2", class: "class2", content: "content2" } ]

我想要一个返回数组的函数foo

代码语言:javascript
复制
[ li [ id_ rec.id, name_ rec.name, class_ rec.class ] [ text rec.content ]
, li [ id_ rec.id, name_ rec.name, class_ rec.lass ] [ text rec.content ] ]

其中rec是recordObject的名称(很明显,这两个数组并不相同,而是实际上映射在初始记录上)。

(点语法是一种类似于标准getter/setter标记的purescript记录语法表示法)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-14 13:52:55

我的第一个想法是模糊地创建一个清单,其中包括 取$ length xs $重复ARecordObject 然后将记录映射到列表上,但我并不确定如何将其转换为代码。无论如何,这似乎都是错误的,因为我的计划涉及改变ARecordObject的状态,这是不可能的。

函数式程序员不只是避免变异,因为它是不-不(实际上,许多功能程序仔细使用控制剂量的可变)-我们这样做是因为它产生更安全,更简单的代码。

也就是说:你在思考我所说的“alloc init模式”,在这里你创建了某种“空”值,然后开始计算它的属性。请原谅我的强烈态度,但这是一个从根本上破坏了编程模型,这是手工内存管理时代遗留下来的;使用它的代码永远不会安全,依赖它的抽象将永远是泄漏的。这个成语不适合于任何比C更高级的语言,然而,如果我每次看到这样的代码时都有一磅重.

代码语言:javascript
复制
var foo = new Foo();
foo.Bar = new Bar();
foo.Bar.Baz = new Baz();

...I将是一个富有的人(na na)。默认情况应该是在了解对象的外观之后创建它们:

代码语言:javascript
复制
var foo = new Foo(new Bar(new Baz()));

这更简单--您只是计算一个值,而不是进入指针引用的内存来更新其内容--更重要的是,它更安全,因为类型检查器确保您没有忘记一个属性,并且它允许您使Foo不可变。最干净的命令式代码是函数式代码--只有当需要时(或者当语言强制您的手时),您才应该成为命令式代码。

不管怎么说,大喊大叫。关键是,通过不顾一切的思考,你使自己的生活变得比必要的更艰难。只需编写一个从单个对象计算单个<li>的函数.

代码语言:javascript
复制
toLi :: MyRecord -> HTML
toLi x = li [ id_ x.id, name_ x.name, class_ x.class ] [ text x.content ]

..。(请注意,我并没有以某种方式创建一个“空”li,然后填充它的值),然后在输入列表上进行map

代码语言:javascript
复制
toLis :: [MyRecord] -> [HTML]
toLis = map toLi

这也是我在JS中的做法,尽管语言并不要求我这样做。没有副作用,没有变异,不需要Eff -只是简单,安全,纯功能代码.

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41647753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档