首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将值列表作为参数应用于函数

将值列表作为参数应用于函数
EN

Stack Overflow用户
提问于 2015-12-07 16:29:48
回答 2查看 1.2K关注 0票数 2

我是否可以将n个值的列表应用到接受n个值的函数,其中n是可变的?

第一个天真的尝试如下,但编译器(公平地)抱怨一个weird self-referential type for applyN

代码语言:javascript
复制
applyN f xs =
    case xs of
        [] -> f
        (x::xs) -> applyN (f x) xs

我看不出折叠是如何工作的,也无法尊重它的类型签名。

对于上下文,我想要列出N个Json解码器并评估

代码语言:javascript
复制
Json.objectN ConstructorN n1 n2 ... nN

显然,如果n是已知的(假设2),那么我们就有

代码语言:javascript
复制
case lst of
    (d1 :: d2 :: _) -> Json.object2 Constructor2 d1 d2
    otherwise -> ....

但是,如果我不能泛化n,则需要编写大量的代码。

我担心这是不可能的,就像在Haskell中一样,needs some special compiler flags

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-10 09:32:41

在Json解码的上下文中,如果您有带有解码器的列表文本,则可以执行与applyN等效的操作。此模式使用map: (a -> b) -> Decoder a -> Decoder bandMap : Decoder (a -> b) -> Decoder a -> Decoder b函数。你就这样用它:

代码语言:javascript
复制
Constructor
  `Json.map` n1
  `Json.andMap` n2
  `Json.andMap` ...
  `Json.andMap` nN

遗憾的是,并不是每个核心模块都提供andMap。如果有map2andThen,您可以自己定义它。在本例中,object2工作,基本上与map2相同。所以:

代码语言:javascript
复制
andMap : Decoder (a -> b) -> Decoder a -> Decoder b
andMap decFun decA =
  object2 (\f a -> f a) decFun decA

您也可以使用Json.Decode.Extra.apply,这也是一样的,只是以一种非标准的方式命名。

*榆树世界内的非标准

票数 1
EN

Stack Overflow用户

发布于 2015-12-07 22:38:54

不,您不能这样做,至少没有依赖类型,或者至少有某种类型级别的欺骗,这在Elm中是没有的(参考:How do I define Lisp’s apply in Haskell?)。

(顺便说一句,这就是为什么有所有的objectN函数。)

尝试重构您的代码-- f不能只列出一个列表吗?

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

https://stackoverflow.com/questions/34138447

复制
相关文章

相似问题

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