Haskell 使用防护装置和分段

Haskell 使用防护装置和分段,haskell,Haskell,我是Haskell的初学者,为了我的家庭作业,我必须写两个版本的函数:使用和不使用分段。如果参数大于100,则此函数之一应返回True,否则返回False 没有分段的功能运行良好: f5 x | x>100 = True | otherwise = False 但第二个版本没有: f5' | (>100) = True | otherwise = False 你能告诉我如何正确地编写这个函数吗?你没有分段的函数太复杂了,给你带来了麻烦。应该是 f5 x = x

我是Haskell的初学者,为了我的家庭作业,我必须写两个版本的函数:使用和不使用分段。如果参数大于100,则此函数之一应返回True,否则返回False

没有分段的功能运行良好:

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代码失败的原因(使用保护中的函数)。为了便于讨论?我不同意!