我是否可以将n个值的列表应用到接受n个值的函数,其中n是可变的?
第一个天真的尝试如下,但编译器(公平地)抱怨一个weird self-referential type for applyN
applyN f xs =
case xs of
[] -> f
(x::xs) -> applyN (f x) xs我看不出折叠是如何工作的,也无法尊重它的类型签名。
对于上下文,我想要列出N个Json解码器并评估
Json.objectN ConstructorN n1 n2 ... nN显然,如果n是已知的(假设2),那么我们就有
case lst of
(d1 :: d2 :: _) -> Json.object2 Constructor2 d1 d2
otherwise -> ....但是,如果我不能泛化n,则需要编写大量的代码。
我担心这是不可能的,就像在Haskell中一样,needs some special compiler flags。
发布于 2015-12-10 09:32:41
在Json解码的上下文中,如果您有带有解码器的列表文本,则可以执行与applyN等效的操作。此模式使用map、: (a -> b) -> Decoder a -> Decoder b和andMap : Decoder (a -> b) -> Decoder a -> Decoder b函数。你就这样用它:
Constructor
`Json.map` n1
`Json.andMap` n2
`Json.andMap` ...
`Json.andMap` nN遗憾的是,并不是每个核心模块都提供andMap。如果有map2或andThen,您可以自己定义它。在本例中,object2工作,基本上与map2相同。所以:
andMap : Decoder (a -> b) -> Decoder a -> Decoder b
andMap decFun decA =
object2 (\f a -> f a) decFun decA您也可以使用Json.Decode.Extra.apply,这也是一样的,只是以一种非标准的方式命名。
*榆树世界内的非标准
发布于 2015-12-07 22:38:54
不,您不能这样做,至少没有依赖类型,或者至少有某种类型级别的欺骗,这在Elm中是没有的(参考:How do I define Lisp’s apply in Haskell?)。
(顺便说一句,这就是为什么有所有的objectN函数。)
尝试重构您的代码-- f不能只列出一个列表吗?
https://stackoverflow.com/questions/34138447
复制相似问题