2016-09-18 7 views
-2

私はHaskellで数値のリストを取り、最大の連続したサブシーケンスの値を返すプログラムを書こうとしています。else文のガードはコンパイルされません: '|'入力時の解析エラー

最初のガードが付いた行の7行目でコンパイルエラーが発生します。

maxsubseq list = maxsubseqRecurse 0 list 

maxsubseqRecurse sofar restOfList = 
    if null restOfList 
     then sofar 
     else 
     | if newSofar < 0 
     |  then maxsubseqRecurse 0  newRestOfList 
     |  else maxsubseqRecurse sofar newRestOfList 
     where 
      newSofar = sofar + head restOfList 
      newRestOfList = tail restOfList 

なぜガードが有効な構文ではないのですか?私の意図は、newSofarとnewRestOfListの定義をガードがある3行で利用できるようにすることです。必要のないガード -

答えて

4

は大雑把に言うと、警備員は単に|を削除し、あなたのコードで

f x y 
    | cond1 x y = ... 
    | cond2 x y = ... 
    | otherwise = ... 

のように、=の左側に使用されています。 ifで十分です。

また、if null, head, tailを使用すると、より良い選択肢が存在するため、一元的です。あなたがnullのチェックを忘れる日にhead,tailがプログラムをクラッシュすることに注意してください。パターンマッチングにはそのような問題はないため、可能な場合は非常に優先されます。警備員を再導入

maxsubseqRecurse sofar [] = sofar 
maxsubseqRecurse sofar (h:newRestOfList) = 
    if newSofar < 0 
    then maxsubseqRecurse 0  newRestOfList 
    else maxsubseqRecurse sofar newRestOfList 
     where 
     newSofar = sofar + h 

、我々は得る:

maxsubseqRecurse sofar [] = sofar 
maxsubseqRecurse sofar (h:newRestOfList) 
    | newSofar < 0 = maxsubseqRecurse 0  newRestOfList 
    | otherwise = maxsubseqRecurse sofar newRestOfList 
    where 
    newSofar = sofar + h 
関連する問題