【发布时间】:2017-03-20 10:36:15
【问题描述】:
此问题仅供娱乐。请不要把这个问题看得太认真。
我目前正在学习F#,有兴趣看看有没有简洁的方式来定义map4,使用现有函数List.map2、List.map3、管道前进/后退、前进/后退组合等。
即
let map4 f a b c d = ......
map4 f [a1;a2] [b1;b2] [c1;c2] [d1;d2]
// output: [f(a1,b1,c1,d1); f(a2,b2,c2,d2)]
我可以递归解决这个问题,或者定义一个新的操作符(见下面的 URL)
http://www.fssnip.net/9W/title/nary-Seqmap-
http://call-with-cc-en.blogspot.sg/2009/04/applicative-functors-mapping-function.html
我也可以通过结合 List.map2 和 List.map3 来解决这个问题,使用部分应用函数 f(a,b,?,?)
let map4 f a b c d =
List.map3 (fun g y -> g y) (List.map2 f a b) c d
我可以尝试使用前向组合来缩短我上面的代码(并使其尽可能抽象/令人困惑)
let map4 f a =
List.map2 f a >> List.map3 id;;
// Output type: f:('a -> 'b -> 'c -> 'd -> 'e) ->
// a:'a list -> ('b list -> 'c list -> 'd list -> 'e list)
我想知道是否可以通过去掉“f”和“a”来进一步缩短它,结果是:
let map4 = ...... (* Use only List.map2, List.map3, |>, |<, >>, <<, etc.*) ..........
这可能会造成不必要的混乱,但它会很酷。谢谢。
编辑:
改编TheInnerLight的回答:
let inline (<!>) f xList = List.map f xList
let inline (<*>) gList xList = List.map2 (id) gList xList
let map4 f w x y z = f <!> w <*> x <*> y <*> z
let map5 f v w x y z = f <!> v <*> w <*> x <*> y <*> z
let map6 f u v w x y z = f <!> u <*> v <*> w <*> x <*> y <*> z
【问题讨论】:
标签: f#