2017-03-10 16 views
0

非常に単純なコードです。最後の3番目の項目をリストから取得します。 2のHaskellのif文が正しく動作しない

list numbers = if length numbers > 3 
then numbers!!(length numbers - 3) 

else "length must be greater than 2" 

私はしかし、このエラーを得続けるGHCiの上でそれを実行しようと、

*メイン>リスト[2,3,4]

<interactive>:65:7: No instance for (Num [Char]) 
arising from the literal  `2' 
Possible fix: add an instance declaration for (Num [Char]) 
In the expression: 2 
In the first argument of `list', namely `[2, 3, 4]' 
In the expression: list [2, 3, 4] 

答えて

2

種類thenelse句の式が一致する必要があります。枝の片側がリスト要素を返し、もう片方が文字列を返すので、ghciはリスト要素が文字列でなければならないと結論づけます。しかし、数字が[2,3,4]と指定されています。したがって、苦情は:それはStringに番号を有効にする方法を知らない。

代わりMaybeまたはEither値を返す考えてみましょう:

list numbers = if length numbers > 3 
    then Right (numbers!!(length numbers - 3)) 
    else Left "length must be greater than 2" -- sic: 3, not 2 
+1

変数の型が同じでなければならないのif-else文では?この言語はとてもかわいいです –

+1

@bossrevs if-elseは値に評価される式です。多くのプログラミング言語は同じセマンティクスを持っています。ハスケルはいろいろな意味で「奇妙」かもしれませんが、これはその1つではありません – user2297560

+1

@bossrevs確かに。 'then foo then else else'のような式の型はどうでしょうか?' then'節と 'else'節は一致しません。ハスケルに限らず、他のほとんどの言語で 'if' /' then'/'else'は式ではなく文であり、" statement "を独自の型と考えることができます(そして、何も挿入しないデフォルトの文があります指定しない場合は 'else'ブランチです)。 –

関連する問題