我不是Haskell程序员,但我对以下问题感到好奇.
非正式功能规范:
让MapProduct成为一个函数,它接受一个名为F的函数和多个列表.它返回一个列表,其中包含每个可能组合中每个列表中一个参数调用F的结果.
例:
调用MapProduct,其中F是一个只返回其参数列表和两个列表的函数.其中一个列表包含整数1和2,另一个包含字符串"a"和"b".它应该返回一个包含列表的列表:1和"a",1和"b",2和"a",2和"b".
问题:
.
Prelude> :m + Control.Applicative
Prelude Control.Applicative> (,,) <$> [1,2,3] <*> ["a","b","c"] <*> [0.8, 1.2, 4.4]
[(1,"a",0.8),(1,"a",1.2),...,(3,"c",4.4)]
Run Code Online (Sandbox Code Playgroud)
F的类型取决于您要应用的列表.<$>这里是fmap,(<*>) :: f(a->b) -> f a -> f b在f = []这里.
- 你能处理不同列表作为输入吗?(例如1和输入列表中的"a")
没有异类列表这样的东西.但是,您可以使用存在类型模拟特定上下文的异构列表.然后你可以使用上面的方法来做MapProduct.
*Main Control.Applicative> :i SB
data ShowBox where
SB :: forall s. (Show s) => s -> ShowBox
-- Defined at v.hs:1:35-36
*Main Control.Applicative> [SB 2, SB "a", SB 6.4]
[2,"a",6.4]
*Main Control.Applicative> (,) <$> [SB 2, SB "a", SB 6.4] <*> [SB 'z', SB 44]
[(2,'z'),(2,44),("a",'z'),("a",44),(6.4,'z'),(6.4,44)]
Run Code Online (Sandbox Code Playgroud)