Haskell测验:一个简单的功能

lev*_*evy 2 haskell

我不是Haskell程序员,但我对以下问题感到好奇.

非正式功能规范:

让MapProduct成为一个函数,它接受一个名为F的函数和多个列表.它返回一个列表,其中包含每个可能组合中每个列表中一个参数调用F的结果.

例:

调用MapProduct,其中F是一个只返回其参数列表和两个列表的函数.其中一个列表包含整数1和2,另一个包含字符串"a"和"b".它应该返回一个包含列表的列表:1和"a",1和"b",2和"a",2和"b".

问题:

  • MapProduct是如何实现的?
  • 功能的类型是什么?什么是F的类型?
  • 可以通过查看其类型来猜测函数的功能吗?
  • 你能处理不同列表作为输入吗?(例如1和输入列表中的"a")
  • 您需要引入什么额外限制(如果有)来实现MapProduct?

ken*_*ytm 8

  • MapProduct是如何实现的?

.

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的类型?

F的类型取决于您要应用的列表.<$>这里是fmap,(<*>) :: f(a->b) -> f a -> f bf = []这里.

  • 你能处理不同列表作为输入吗?(例如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)