Haskell 使用防护装置和分段
我是Haskell的初学者,为了我的家庭作业,我必须写两个版本的函数:使用和不使用分段。如果参数大于100,则此函数之一应返回True,否则返回False 没有分段的功能运行良好:Haskell 使用防护装置和分段,haskell,Haskell,我是Haskell的初学者,为了我的家庭作业,我必须写两个版本的函数:使用和不使用分段。如果参数大于100,则此函数之一应返回True,否则返回False 没有分段的功能运行良好: f5 x | x>100 = True | otherwise = False 但第二个版本没有: f5' | (>100) = True | otherwise = False 你能告诉我如何正确地编写这个函数吗?你没有分段的函数太复杂了,给你带来了麻烦。应该是 f5 x = x
f5 x | x>100 = True
| otherwise = False
但第二个版本没有:
f5' | (>100) = True
| otherwise = False
你能告诉我如何正确地编写这个函数吗?你没有分段的函数太复杂了,给你带来了麻烦。应该是
f5 x = x > 100
因为
(>) :: Ord a => a -> a -> Bool
已生成一个Bool
。没有必要在顶部使用防护装置。想想看:如果x>100
是真的
,那么你就用你的守卫的第一个分支返回真的
,如果是假的
你就用第二个分支返回假的
。您可以在不丢失任何内容的情况下消除额外的分支
然后,您只需打掉x
:
f5 = (> 100)
你原来的失败是因为
(> 100) :: (Ord a, Num a) => a -> Bool
是一个最终给出
Bool
的函数,而不是Bool
本身。因此,当你试图在防护装置中使用它时,它会爆炸,在防护装置中预期会出现普通的Bool
。公认的答案是正确的。但为了便于讨论,还有另一种方法可以使防护程序无需指向:使用视图模式
{-# LANGUAGE ViewPatterns #-}
-- Don't ever do this :)
f5 ((> 100) -> True) = True
f5 _ = False
它的效果就像您正在寻找的一样,将变量从保护中“抽象”出来。只是我们将保护变成了一种模式来实现这一点。相关问题:如果x>100,那么您将如何简化
如果x>100,那么True或者False
以避免使用冗余分支?您可能需要添加OP代码失败的原因(使用保护中的函数)。为了便于讨论?我不同意!