Spooky haskell功能以某种方式知道您的输入

Joh*_*Doe 1 haskell

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)

zbw*_*zbw 8

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,您可以替换sumListV3myFoldr (+) 0在它被称为地方:

sumListV3 [1,2] 
  = (myFoldr (+) 0) [1,2]
  = myFoldr (+) 0 [1,2]
Run Code Online (Sandbox Code Playgroud)