Этот код:Haskell «где» отступы: почему он должен быть отступом прошлого идентификатора?
import Data.Char (digitToInt)
myInt :: String -> Int
myInt [] = error "bad input: empty string"
myInt (x:xs)
| x == '-' = -1 * myInt xs
| otherwise = foldl convert 0 (x:xs)
where convert acc x
| x `elem` ['0'..'9'] = 10 * acc + digitToInt x
| otherwise = error ("bad input: not an int - " ++ [x])
Сбой:
Prelude> :l safeListFs.hs
[1 of 1] Compiling Main (safeListFs.hs, interpreted)
safeListFs.hs:9:8: parse error (possibly incorrect indentation)
Failed, modules loaded: none.
Но эта версия:
import Data.Char (digitToInt)
myInt :: String -> Int
myInt [] = error "bad input: empty string"
myInt (x:xs)
| x == '-' = -1 * myInt xs
| otherwise = foldl convert 0 (x:xs)
where convert acc x
| x `elem` ['0'..'9'] = 10 * acc + digitToInt x
| otherwise = error ("bad input: not an int - " ++ [x])
нормально:
Prelude> :l safeListFs.hs
[1 of 1] Compiling Main (safeListFs.hs, interpreted)
Ok, modules loaded: Main.
Я не могу понять, почему те, два последних вмятины имеют значение.
Этот вопрос является хорошим примером того, почему я ненавижу пробельные синтаксис в Haskell; он всегда кажется мне неинтуитивным по сравнению с, скажем, Python. К сожалению, единственное, что мне не нравится * больше *, - это уродливые фигурные скобки, засоряющие мой код. –
http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#deftypes.offside Правило офсайда кажется интуитивным для меня. Вам просто нужно перестать думать о блоках (например, Python, что не имеет смысла в Haskell) и вместо этого подумать о продолжения объявления или выражения. – ephemient
Используйте умный текстовый редактор и забудьте о странных правилах идентификации. –