为什么有时函数在其定义中有参数但在实际函数中没有参数?
这是我试图理解的一段代码
data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
isWeekend :: Day -> Bool
isWeekend Sat = True
isWeekend Sun = True
isWeekend _ = False
isWeekday :: Day -> Bool
isWeekday = not.isWeekend
如果我试图评估 isWeekday Mon(我从函数定义中指定了一个 Day 类型的参数,即使实际函数没有它),它可以工作。如果我将 isWeekday 修改为 isWeekday 日,则会出现以下错误:无法匹配预期类型Bool' with actual type Day -> Bool'。有人能告诉我为什么我必须跳过类型为 Day 的参数吗?谢谢!
回答
not . isWeekend具有类型的原因Day -> Bool是因为not . isWeekend将返回一个函数。函数式编程的一个关键方面是函数是“一等公民”:您可以将函数作为参数传递,并返回函数。
由于(.)具有 type(.) :: (b -> c) -> (a -> b) -> (a -> c)和nottype not :: Bool -> Bool,这意味着not . isWeekend,或更规范的(.) not isWeekend因此具有类型:
(.) :: ( b -> c ) -> ( a -> c ) -> ( b -> c )
not :: Bool -> Bool
isWeekend :: Day -> Bool
--------------------------------------------------------
not . isWeekend :: Day -> Bool
此表达式 this 将返回一个将 aDay作为参数并返回 a的函数Bool。
您可以编写一个isWeekday带有参数的版本:
isWeekday :: Day -> Bool
isWeekday day = not (isWeekend day)
但是你因此不能将其定义为,因为这意味着它isWeekday2 day = not . isWeekendday是一个“无用”的参数,它仍然会返回一个函数,所以签名是isWeekday2 :: a -> Day -> Bool。