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
这是明智的。
我是 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
这是明智的。