我如何使这个Haskell幂函数尾递归?
turboPower a 0 = 1
turboPower a b
| even b = turboPower (a*a) (b `div` 2)
| otherwise = a * turboPower a (b-1)
Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,我很难理解推断类型和类似的工作方式.
map :: (a -> b) -> [a] -> [b]
(.) :: (a -> b) -> (c -> a) -> c -> b
Run Code Online (Sandbox Code Playgroud)
这到底是什么意思呢?
foldr :: (a -> b -> b) -> b -> [a] -> b
foldl :: (a -> b -> a) -> a -> [b] -> a
foldl1 :: (a -> a -> a) -> [a] -> a
Run Code Online (Sandbox Code Playgroud)
这些有什么区别?
和推断的类型
foldr map是[a] - > [a - > a] - > [a]
但为什么会这样呢?
谢谢!
我想定义一个函数复制,仅使用列表推导来复制数值列表,例如:
replicate [5,1,3,2,8,1,2]
output: [5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2]
Run Code Online (Sandbox Code Playgroud)
我知道这很容易使用内置函数的'replicate',但只允许列表理解,我该怎么办呢?
谢谢!
定义一个函数复制,给定一个数字列表返回一个列表,每个数字都复制其值.使用折叠,地图和拍摄
..>复制[5,1,3,2,8,1,2]
产量:[5,5,5,5,5,1,3,3,3,2,2,8,8,8,8,8,8,8,8,1,2,2]
我已经使用List理解和递归来解决这个问题:
replicate2 [] = []
replicate2 (n:nn) = take n(repeat n) ++ replicate2 nn
Run Code Online (Sandbox Code Playgroud)
但是你如何使用折叠和地图来做到这一点?到目前为止我有:复制n = map(foldl1(取n(重复n))n)n这显然是错误的,但我想我很接近..
所以任何帮助都会很好,谢谢!