为什么嵌套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)
[]
上进行模式匹配,而不是使用那些辅助函数。