为什么有时函数在其定义中有参数但在实际函数中没有参数?

这是我试图理解的一段代码

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 . isWeekend,因为这意味着它day是一个“无用”的参数,它仍然会返回一个函数,所以签名是isWeekday2 :: a -> Day -> Bool


以上是为什么有时函数在其定义中有参数但在实际函数中没有参数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>