2015-11-03 109 views
1

我一直在寻找了一段时间了,并没有发现我的问题的任何答案。 我试图编写一个函数,根据是否在一年内返回特定月份的日期。我以前已经定义了函数“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 
+0

'如果那么如果然后X1 X2其他别的x3'?或者你可能有兴趣在的['MultiWayIf'(https://downloads.haskell.org/~ghc/7.6.1/docs/html/users_guide/syntax-extns.html#multi-way-if)扩展GHC。 – Bakuriu

+0

无论如何,代码似乎是错误的。你有'mes == [01,03,..]'然后'mes == 02'。但是列表不太可能是'Num'实例,所以这可能会引发类型错误。 – Bakuriu

+0

我想程序首先检查lapyear anyo的条件,取决于对去其他三个条件 – Felix

回答

2

你可能会喜欢的MultiWayIf扩展。

{-# LANGUAGE MultiWayIf #-} 

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

谢谢!我认为这会起作用,但现在出现一个错误,提示“多路if-expressions需要MultiWayIf打开”。我如何导入multiwayif? – Felix

+0

它的工作现在,我只有通过对multiwayif:一套-XMultiWayIf再次感谢你 – Felix

+2

注意'{ - #语言MultiWayIf# - }'。如果将它放在文件的最顶端,则不需要命令行标志。 – luqui

0

在普通的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 ... 
    

我相信最后一种是最流行的。

+0

似乎是最简单的方式,而无需导入任何东西。谢谢! – Felix