如何处理嵌套条件

bol*_*lts 5 haskell

我正在编写一个函数,如果满足一些条件,我想返回True.例如,考虑这个比较两个字符串的函数:

test st1 st2
    | st1 == st2
        | "foo" `isInfixOf` st1 = True
        | "baz" `isInfixOf` st2 = True
        | otherwise = False
    | otherwise = False
Run Code Online (Sandbox Code Playgroud)

显然,这个功能是不正确的.但是,我正在寻找一种测试几种条件的方法,我想知道:

A)最明智的方法是什么?B)是否有类似于我生成的使用警卫的方法?

为清楚起见,在我上面的简单示例中,输出test应该如下:

test "foobuz" "foobuz" = True
test "foobutter" "foobuz" = False
test "buz" "buz" = False
Run Code Online (Sandbox Code Playgroud)

NB链接条件可能是一个选项,但在经过两到三次测试后它变得非常难以理解:

test st1 st2 = st1 == st2 && "foo" `isInfixOf` s1 || "baz" `isInfixOf` s2
Run Code Online (Sandbox Code Playgroud)

我在想可能有办法使用Endo Monoid来测试几个条件链?

mhw*_*bat 6

塞巴斯蒂安对当地助手的建议很好.但是,您给出的特定示例基本上归结为if CONDITION then True else False可以替换为CONDITION.所以你可以简单地写:

main = print (fac 5)
test st1 st2 = st1 == st2 && ("foo" `isInfixOf` st1' || "baz" `isInfixOf` st2)
Run Code Online (Sandbox Code Playgroud)

另一种写这个的方法是:

main = print (fac 5)
test st1 st2
    | st1 == st2 && "foo" `isInfixOf` st1 = True
    | st1 == st2 && "baz" `isInfixOf` st2 = True
    | otherwise                           = False
Run Code Online (Sandbox Code Playgroud)