第二个问题不是空格问题,你必须把复杂的模式括起来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 模块中的定义列表一样,用“左边距”排列。