2番目の問題は空白の問題ではありません。複雑なパターンを括弧で囲む必要があるため、次のa:asようb:bsに記述します。add res (a:as) (b:bs)
別の言い方をすれば、空白についてのポイントを言い換えると、where句での空白の見方は、トップレベルでの見方です。あなたは書くでしょう:
addNums1 key num = add [] key num
add res (a:as) (b:bs)
| as == [] = res
| otherwise = add (res ++ [a+b]) as bs
したがって、インデントを追加すると、次のようになります。
addNums2 key num = add [] key num
where
add res (a:as) (b:bs)
| as == [] = res
| otherwise = add (res ++ [a+b]) as bs
ただし、where句のインデントを解除することはできないため、左マージンになります。(私はそれを同等のものに変更します)
addNums key num = add [] key num
where
add res a:as b:bs
| a == [] = res
| otherwise = add res:(a+b) as bs
警備員が左側にいるのでadd; ここでは、実際には左マージンになります。従属定義を統治と並べることをお勧めしますwhere:
woof xs = foldr moo baaaah xs
where
moo :: Integer -> Integer -> Integer
moo x 0 = 17
moo x y = x * x + y * (y + x + 1)
baaaah :: Integer
baaaah = 3
-- *Main> woof [1,2]
-- 529
いくつかのものほど美しくはありませんが、インデントについて考えることの認知的負荷が軽減されるため、エラーが発生しにくくなります。(そしてオレグはそれをします!)それはすぐにこの困難も回避したでしょう。どこにでも適しているわけではないと思いますが、これはより魅力的で、インデントの質問がより明確になる可能性があります。
woof xs = foldr moo baaaah xs where
moo :: Integer -> Integer -> Integer
moo x 0 = 17
moo x y = x * x + y * (y + x + 1)
baaaah :: Integer
baaaah = 3
次に、where句の定義のリストは、「左マージン」と並んでいるHaskellモジュールの定義のリストに似ていることがわかります。