Haskell结合多种条件

时间:2015-11-03 21:45:40

标签: function haskell if-statement conditional-statements

我一直在寻找一段时间,并没有找到我的问题的任何答案。 我试着编写一个函数来返回特定月份的日期,具体取决于它是否在一年中。我已经定义了功能" lapyear"先前。我的问题是如何在另一个If条件下创建If条件?

非常感谢您的回答:)

lapyear:: Int->Bool
lapyear a
    |((rem)a 400)==0 = True
    |((rem)a 100)==0 = False
    |((rem)a 4)==0 = True
    |otherwise = False

type Mes = Int
type Anyo = Int
type Dias= Int
daysAmonth:: Mes->Anyo->Dias
daysAmonth mes anyo
if lapyear anyo then do
    |or[mes==01,mes==03,mes==05,mes==07,mes==08,mes==10,mes==12] = 31
    |mes==02 = 29
    |otherwise = 30
else
    |or[mes==01,mes==03,mes==05,mes==07,mes==08,mes==10,mes==12] = 31
    |mes==02 = 28
    |otherwise = 30

2 个答案:

答案 0 :(得分:3)

您可能希望MultiWayIf扩展名。

{-# LANGUAGE MultiWayIf #-}

if lapyear anyo then if
    | or [...] -> 31
    | mes == 20 -> 29
    | otherwise -> 30
else if
    | ...

答案 1 :(得分:1)

普通Haskell中的一些替代方案(没有扩展名):

  • if then else的链:

    if lapyear anyo then
       if or [...] then 31
       else if mes == 02 then 29
       else 30
    else ...
    
  • 使用let

    if lapyear anyo then
       let result | or [...]  = 31
                  | mes == 02 = 29
                  | otherwise = 30
            in result
    else ...
    
  • 使用case

    if lapyear anyo then
       case () of
       _ | or [...]  -> 31
         | mes == 02 -> 29
         | otherwise -> 30
    else ...
    

我相信最后一个是最受欢迎的。