Haskell 函数接受 2 个参数,但在定义中 none

Haskell function takes 2 parameters but in the definition none

我是 Haskell 的新手,我想了解在 Haskell 中创建的游戏(井字游戏)。我知道如果一个函数有 n 个参数,那么你必须在函数定义中提供 n 个参数。示例:

f :: Int -> Int -> String
f a b = "This function makes no sense" 

但是在这个 Haskell 脚本中有一个函数接受两个参数,但在定义中它有 none。当然,它在工作,但我似乎无法弄清楚为什么。

import Data.Map qualified as M
type Board = M.Map (Int, Int) Marker
data Marker = X | O | Blank deriving Eq

getMarker :: Board -> (Int, Int) -> Marker
getMarker = flip $ M.findWithDefault Blank

关于这个函数的作用的任何想法,更重要的是,它为什么起作用(你可以看到 getMarker 在最后一行采用 0 个参数)?

误区在这里:

... (you can see that getMarker takes 0 parameters at the last line) ...

让您感到困惑的是 partial application


getMarker :: Board -> (Int, Int) -> Marker
getMarker = flip $ M.findWithDefault Blank

最后一行 actually 告诉你的是 getMarker 没有 do 任何参数 - 但是它们仍然被传递给 flip $ M.findWithDefault Blank.

创建的函数

或者,更准确地说,getMarker 求值为声明类型的函数,该函数应用于 getMarker 的参数。

你有getMarker :: Board -> (Int, Int) -> Marker,所以叫做

getMarker board pos

因为你有 getMarker = flip $ M.findWithDefault Blank,这相当于:

(flip $ M.findWithDefault Blank) board pos

展开$

(flip (M.findWithDefault Blank)) board pos

函数应用是左关联的,所以(f x) y等同于f x y

flip (M.findWithDefault Blank) board pos

flip f x y等价于f y x,所以表达式等于:

(M.findWithDefault Blank) pos board

再次感谢函数应用的左结合性:

M.findWithDefault Blank pos board

这是明智的。