Haskell映射函数列表

New*_*bie 2 haskell

我是Haskell的新手,我有以下问题.我必须创建一个数字列表[f1,f2,f3 ...]其中fi x = x ^ i.然后我必须创建一个应用于fi数字列表的函数.例如,如果我有一个列表lis = [4,5,6,7..],输出将是[4^1, 5^2,6^3, 7^4...].这是我到目前为止所写的:

powers x= [x^y |y<-[1,2,3,4]]
Run Code Online (Sandbox Code Playgroud)

list = [1,2,3,4]

match :: (x -> xs) -> [x] -> [xs]
match f [] = []
match f (x:xs) = (f x) : ( match f xs )
Run Code Online (Sandbox Code Playgroud)

所以,如果我把list = [1,2,3]输出为[1,1,1,1] [2,4,8,16],[3,9,27,81]而不是[1, 4,27]

你能告诉我出了什么问题并指出了正确的方向吗?

Ret*_*ief 6

第一个问题是powers类型Int -> [Int].我认为,你真正想要的是一种类型[Int -> Int]- 一系列Int -> Int函数,而不是一个函数,它接受一个Int并返回一个列表Int.如果您这样定义powers:

powers = [(^y) | y <- [1..4]]
Run Code Online (Sandbox Code Playgroud)

您可以使用zipWith将每个电源应用于列表中的相应元素,如下所示:

zipWith ($) powers [1,2,3] -- returns [1,4,27]
Run Code Online (Sandbox Code Playgroud)

($)它的左边(第一)参数来其右(第二)的道理也适用.

请注意,使用powers此处定义的将限制返回列表的长度为4.如果您希望能够使用任意长度列表,则需要创建powers无限列表,如下所示:

powers = [(^y) | y <- [1..]]
Run Code Online (Sandbox Code Playgroud)

当然,正如dave4420所指出的,一种更简单的技术就是简单地使用

zipWith (^) [1,2,3] [1..] -- returns [1,4,27]
Run Code Online (Sandbox Code Playgroud)

  • 或者`zipWith(^)list [1 ..]`. (3认同)