为什么嵌套let/guard块会出现缩进错误 我正在编写一个转置函数,作为现实世界哈斯克尔的练习。然而,我深感沮丧,因为haskell无法解析(或者我无法正确编写)我的代码
问题是:为什么嵌套let/guard块会出现缩进错误 我正在编写一个转置函数,作为现实世界哈斯克尔的练习。然而,我深感沮丧,因为haskell无法解析(或者我无法正确编写)我的代码,haskell,Haskell,问题是: transpose :: [Char] -> [Char] transpose x = let splitted = lines x transposed = tpose splitted tpose :: [String] -> [String] tpose xs | null xs = [] | all null x
transpose :: [Char] -> [Char]
transpose x =
let splitted = lines x
transposed = tpose splitted
tpose :: [String] -> [String]
tpose xs
| null xs = []
| all null xs = []
| otherwise = let
safeHead "" = ''
>> safeHead x = head x
safeTail "" = ""
safeTail x = tail x
in (map safeHead xs):(tpose (map safeTail xs))
in unlines transposed
分析错误位于>
。整个消息是分析错误(可能是不正确的缩进或不匹配的括号)
我甚至尝试在没有let的情况下重写代码,比如:
tpose :: [String] -> [String]
tpose xs
| null xs = []
| all null xs = []
| otherwise = (map safeHead xs):(tpose (map safeTail xs))
where
safeHead "" = ''
safeHead x = head x
safeTail "" = ""
safeTail x = tail x
但仍然无法修复缩进错误。如何正确写入嵌套let/while/guards?错误在前一行-
“
不是有效字符:
safeHead "" = ''
safeHead x = head x
错误在前一行-
“
不是有效字符:
safeHead "" = ''
safeHead x = head x
正如已经指出的,语法错误实际上是
safeHead
中的空字符'
让我们重构一下safeHead
和tpose
不使用transpose
中的任何数据,因此为了清晰起见,可以不对齐
safeHead "" = ' '
safeHead x = head x
safeTail "" = ""
safeTail x = tail x
tpose
可以使用模式匹配,我们可以去掉几个括号:
tpose :: [String] -> [String]
tpose [] = []
tpose xs
| all null xs = []
| otherwise = map safeHead xs : tpose (map safeTail xs)
刚刚离开
transpose :: [Char] -> [Char]
transpose x =
let splitted = lines x
transposed = tpose splitted
in unlines transposed
现在很明显,转置
中的所有let都只做行
,然后tpose
然后取消线
,因此我们应该使用组合:
transpose :: [Char] -> [Char]
transpose = unlines . tpose . lines
正如已经指出的,语法错误实际上是
safeHead
中的空字符'
让我们重构一下safeHead
和tpose
不使用transpose
中的任何数据,因此为了清晰起见,可以不对齐
safeHead "" = ' '
safeHead x = head x
safeTail "" = ""
safeTail x = tail x
tpose
可以使用模式匹配,我们可以去掉几个括号:
tpose :: [String] -> [String]
tpose [] = []
tpose xs
| all null xs = []
| otherwise = map safeHead xs : tpose (map safeTail xs)
刚刚离开
transpose :: [Char] -> [Char]
transpose x =
let splitted = lines x
transposed = tpose splitted
in unlines transposed
现在很明显,转置
中的所有let都只做行
,然后tpose
然后取消线
,因此我们应该使用组合:
transpose :: [Char] -> [Char]
transpose = unlines . tpose . lines
'
是无效语法。'
是无效语法。如何写入空Char
?没有空Char
值。定义函数[a]->a
时,您需要确定为空列表返回的默认值。@t您应该查看Maybe
。现在,我不需要Maybes。。我需要的只是一个空格'
。我知道haskell中没有空的Char
。@thkang我建议在transpose
函数中的(x:xs)
和[]
上进行模式匹配,而不是使用那些辅助函数。我如何编写空的Char
?没有空的Char
值。定义函数[a]->a
时,您需要确定为空列表返回的默认值。@t您应该查看Maybe
。现在,我不需要Maybes。。我需要的只是一个空格'
。我知道haskell中没有这种空的Char
。@thkang我建议在转置
函数中的(x:xs)
和[]
上进行模式匹配,而不是使用那些辅助函数。