2017-01-21 25 views
0

目的は、1から12までの整数を指定すると、関連する月の名前(1月〜1月など)を評価する関数を作成することです。月が間違っています "。 これは私のコードです:haskell複数の条件を持つelse文の場合

list = ["Jan","Feb","Mar","April", "May", "Jun","Jul","Aug","Sep","Oct","Nov","Dec"] 
month x = if x<13 && x>0 
      then x = list !! (x-1) 
      else "Not a month" 

これはエラーMSGである:あなたの助け

+0

@YassineBotabia: '' ||実際にセマンティクスを変更し、エラーを生成するためにそれを変更します。さらにエラーは最初の行の 'x ='ではなく、2行目のエラーである。 –

+0

私はパッティングした直後に実現しました。それは本当だ。 –

答えて

4

ため

多くのおかげでちょうどx =を削除 "=" 入力にエラーを解析します。 (なぜあなたはそれを書くのですか?)

list = ["Jan","Feb","Mar","April","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] 
month x = if x<13 && x>0 
      then list !! (x-1) 
      else "Not a month" 
+0

ご協力いただきありがとうございます。 –

2

はまああなたが書く:あなたはおそらく不可欠世界に使用されている

 
month x = if x0 
      then x =list !! (x-1) 
      else "Not a month" 

(C++、Javaの、...)変数が存在する場合、その他の値を設定して設定することができます。機能的な宣言型言語では、変数は一度しか設定されません。

はさらに値にxを設定する必要はありません、あなただけのようlist!!(x-1)を返却する必要があります。

month x = if x<13 && x>0 
      then list !! (x-1) 
      else "Not a month" 

は動作するはずです。

アン - 私の意見では - しかし、ガードを使用している、これを書くために、よりエレガントな方法:警備員を使用して

month x | x > 0 && x < 13 = list !! (x-1) 
     | otherwise = "not a month" 
+0

ありがとうございました。 x =は私の誤りでした。あなたは正しく機能プログラミングを始めました。 –

3

はここに最善の戦略である:

month x | x > 0 && x < 13  = list !! (x - 1) 
     |otherwise    = "Error" 

ます。また、このためにMaybeを使用することができます操作のタイプ:

mylist = ["Jan","Feb","Mar","April", "May", "Jun","Jul","Aug","Sep","Oct","Nov","Dec"] 

exampleFunc :: [String] -> Int -> Maybe String 
exampleFunc li int 
    | int > 0 && int < 13 = Just (li !! (int - 1)) 
    | otherwise    = Nothing 

Maybeotherwiseの場合、標準値(Nothing)を返すようになります。

+0

バーブラありがとう、あなたのコメントは非常に有用です。 –

+1

''月ではない ''は実際には1ヶ月間ではないので、 ''たぶん文字列 ''をここで絶対に使うべきです。 – chepner

1

また、このようにそれを書き込むことができます。

month = ["Jan","Feb","Mar","April", "May", "Jun","Jul","Aug","Sep","Oct","Nov","Dec"] 
getMonth k = lookup k $ zip [1..] month