将值列表作为函数的参数应用
Apply list of values as arguments to a function
我可以将 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。
不,你不能那样做,至少不能没有依赖类型或至少有一些类型级别的技巧,Elm 中有 none(供参考:How do I define Lisp’s apply in Haskell?)
(这就是为什么有所有 objectN
函数的原因。)
尝试重构您的代码 - 不能f
只列出一个列表吗?
在 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
,其实是一样的,只是命名方式不规范而已*。
*Elm 世界中的非标准无论如何
我可以将 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。
不,你不能那样做,至少不能没有依赖类型或至少有一些类型级别的技巧,Elm 中有 none(供参考:How do I define Lisp’s apply in Haskell?)
(这就是为什么有所有 objectN
函数的原因。)
尝试重构您的代码 - 不能f
只列出一个列表吗?
在 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
,其实是一样的,只是命名方式不规范而已*。
*Elm 世界中的非标准无论如何