Elm 将值列表作为参数应用于函数
我是否可以将n个值的列表应用于接受n个值的函数,其中n是变化的 第一次天真的尝试如下,但编译器(相当)抱怨applyN的Elm 将值列表作为参数应用于函数,elm,Elm,我是否可以将n个值的列表应用于接受n个值的函数,其中n是变化的 第一次天真的尝试如下,但编译器(相当)抱怨applyN的自引用类型怪异 applyN f xs = case xs of [] -> f (x::xs) -> applyN (f x) xs 我也看不出折叠是如何工作的,也看不到它的类型签名 对于上下文,我想获取N个Json解码器的列表并进行评估 Json.objectN ConstructorN n1 n2 ... nN 显然
自引用类型怪异
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 it中是不可能的。不,您不能这样做,至少在没有依赖类型或至少一些类型级别的技巧的情况下是不可能的,这在Elm中是没有的(参考:)
(顺便说一下,这就是为什么有所有的objectN
函数。)
尝试重新构造代码-不能只获取一个列表吗?在Json解码的上下文中,如果你有一个带有解码器的列表文字,你可以做一些相当于applyN
的事情。此模式使用函数:(a->b)->解码器a->解码器b
和以及map:Decoder(a->b)->解码器a->解码器b
。你这样使用它:
Constructor
`Json.map` n1
`Json.andMap` n2
`Json.andMap` ...
`Json.andMap` nN
遗憾的是,并没有为每个核心模块提供和map
。如果存在map2
或然后的话,您可以自己定义它。在本例中,它与map2
基本相同。因此:
andMap : Decoder (a -> b) -> Decoder a -> Decoder b
andMap decFun decA =
object2 (\f a -> f a) decFun decA
您也可以使用,这是相同的东西,只是以一种非标准的方式命名*
*Elm world中的非标准函数是否返回函数?[]->f。我觉得很奇怪,但我真的不知道。阿普林完全错了。但是我需要一个建议,你是在尝试折叠。您希望函数中的返回类型是什么?一份清单,还是某种类型的?顺便说一下,我不认识Elm,我正在学习Haskell。我知道如果你想返回一个列表,在基本情况下返回一个空列表是很容易的。但是,如果你试图建立一个对象,我不知道你应该怎么做。如果您的基本案例匹配一个项目而不是一个空列表,该怎么办?像这样,[x::[]]->f xYou也提到了fold,但我认为fold需要一个累加器。这就是为什么很难找到你想要返回的基本情况。折叠将匹配空列表并返回accumulator.OMG:使用解析器是应用程序这一事实。这对TupleX有用吗?我认为不是因为Tuple会立即检查数组的长度,所以不能增量地处理它?