Int myInt [] = error "bad input: empty string-6ren">
gpt4 book ai didi

Haskell "where"缩进 : why must it be indented past identifier?

转载 作者:行者123 更新时间:2023-12-03 11:33:48 24 4
gpt4 key购买 nike

这段代码:

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 会注意到 where 之后的第一个非空格字符所在的列。出现(在这种情况下, cconvert )并将以该列开头的以下行视为 where 中的新定义.

延续上一行定义的行(例如 | 保护)必须缩进到第一个非空格字符(代码中的 c)的右侧。
c 左侧缩进的一行将在 where 之外(例如,下一个顶级函数的开始)。

它是 where 之后的第一个字符的列这是至关重要的,即使它是在一个新的行:

  where
convert acc x
| ...
anotherFunction x y

^

关于Haskell "where"缩进 : why must it be indented past identifier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2223468/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com