sumListV3功能怎么样?myFoldr需要3个args:function,base case num和list.然而它以某种方式知道列表(基于您的输入),即使它从未在内部代码中指定.
我认为sumListV2它是最简单的.sumListV3甚至如何编译,更不用说正常运行了?
myFoldr :: (a -> b -> b) -> b -> [a] -> b
myFoldr _ baseCase [] = baseCase
myFoldr f b (x:xs) = f x (myFoldr f b xs)
sumListV2 :: [Int] -> Int
sumListV2 xs = myFoldr (+) 0 xs
sumListV3 :: [Int] -> Int
sumListV3 = myFoldr (+) 0
Run Code Online (Sandbox Code Playgroud)
Haskell中的函数是"咖喱"的.
这意味着当你有一个函数时f :: a -> b -> c,它确实是a -> (b -> c),而且f a b确实是(f a) b(因为关联性规则).
因此,当您运行时f a b,它首先执行f a,它返回一个新的类型函数b -> c.然后你可以给它一个b并得到你的类型的最终答案c.
这使您可以部分应用功能:
ghci> let add :: Int -> Int -> Int ; add a b = a + b
ghci> add 2 3
5
ghci> (add 2) 3
5
ghci> let addToTwo = add 2
ghci> :t addToTwo
addToTwo :: Int -> Int
ghci> addToTwo 6
8
ghci> addToTwo 9
11
Run Code Online (Sandbox Code Playgroud)
你的榜样sumListV3正在部分应用myFoldr.(此处为您的案例指定类型.)
myFoldr :: (Int -> Int -> Int) -> Int -> [Int] -> Int
myFoldr :: (Int -> Int -> Int) -> (Int -> ([Int] -> Int))
myFoldr (+) :: Int -> ([Int] -> Int)
myFoldr (+) 0 :: [Int] -> Int
sumListV3 :: [Int] -> Int
Run Code Online (Sandbox Code Playgroud)
由于sumListV3被定义为myFoldr (+) 0,您可以替换sumListV3与myFoldr (+) 0在它被称为地方:
sumListV3 [1,2]
= (myFoldr (+) 0) [1,2]
= myFoldr (+) 0 [1,2]
Run Code Online (Sandbox Code Playgroud)