Haskell 是否可以在不使用列表函数或列表synthax的情况下计算以下迷宫的高度和宽度

Haskell 是否可以在不使用列表函数或列表synthax的情况下计算以下迷宫的高度和宽度,haskell,Haskell,我的目标是编写一个函数,使用以下代码计算迷宫的宽度和高度。到目前为止,我只找到了使用列表函数或列表语法的方法,但我想找到一种不使用列表语法的替代解决方案。我是一名Haskell初学者,对一般编程非常陌生 showLabyrinth labyrinth = putStrLn $ unlines $ [[labyrinth j i | i <- [1..dimH]] | j <- [1..dimV]] where dimH = length . takeWhile (/='

我的目标是编写一个函数,使用以下代码计算迷宫的宽度和高度。到目前为止,我只找到了使用列表函数或列表语法的方法,但我想找到一种不使用列表语法的替代解决方案。我是一名Haskell初学者,对一般编程非常陌生

showLabyrinth labyrinth =
   putStrLn $ unlines $ [[labyrinth j i | i <- [1..dimH]] | j <- [1..dimV]]
 where
   dimH = length . takeWhile (/='O') $ [labyrinth 1 i | i <- [1..]]
   dimV = length . takeWhile (/='O') $ [labyrinth i 1 | i <- [1..]]

labyrinthA 9 _  = 'O'
labyrinthA _ 16 = 'X'
labyrinthA _ 17 = 'O'
labyrinthA 1 _  = 'X'
labyrinthA 2 1  = 'X'
labyrinthA 2 8  = 'X'
labyrinthA 2 12 = 'X'
labyrinthA 2 _  = ' '
labyrinthA 3 1  = 'X'
labyrinthA 3 3  = 'X'
labyrinthA 3 5  = 'X'
labyrinthA 3 6  = 'X'
labyrinthA 3 8  = 'X'
labyrinthA 3 9  = 'X'
labyrinthA 3 10 = 'X'
labyrinthA 3 12 = 'X'
labyrinthA 3 14 = 'M'
labyrinthA 3 _  = ' '
labyrinthA 4 1  = 'X'
labyrinthA 4 2  = 'X'
labyrinthA 4 3  = 'X'
labyrinthA 4 5  = 'X'
labyrinthA 4 6  = 'X'
labyrinthA 4 12 = 'X'
labyrinthA 4 _  = ' '
labyrinthA 5 1  = 'X'
labyrinthA 5 5  = 'X'
labyrinthA 5 8  = 'X'
labyrinthA 5 9  = 'X'
labyrinthA 5 10 = 'X'
labyrinthA 5 12 = 'X'
labyrinthA 5 13 = 'X'
labyrinthA 5 15 = 'X'
labyrinthA 5 _  = ' '
labyrinthA 6 1  = 'X'
labyrinthA 6 3  = 'X'
labyrinthA 6 4  = 'X'
labyrinthA 6 5  = 'X'
labyrinthA 6 7  = 'X'
labyrinthA 6 8  = 'X'
labyrinthA 6 10 = 'X'
labyrinthA 6 _  = ' '
labyrinthA 7 1  = 'X'
labyrinthA 7 6  = 'T'
labyrinthA 7 9  = 'X'
labyrinthA 7 10 = 'X'
labyrinthA 7 11 = 'X'
labyrinthA 7 12 = 'X'
labyrinthA 7 13 = 'X'
labyrinthA 7 14 = 'X'
labyrinthA 7 15 = 'X'
labyrinthA 7 _  = ' '
labyrinthA 8 6  = 'E'
labyrinthA 8 _  = 'X'

labyrinthB 7 6  = '.'
labyrinthB 6 6  = '.'
labyrinthB 5 6  = '.'
labyrinthB 5 7  = '.'
labyrinthB 4 7  = '.'
labyrinthB 4 8  = '.'
labyrinthB 4 9  = '.'
labyrinthB 4 10 = '.'
labyrinthB 4 11 = '.'
labyrinthB 5 11 = '.'
labyrinthB 6 11 = '.'
labyrinthB 6 12 = '.'
labyrinthB 6 13 = '.'
labyrinthB 6 14 = '.'
labyrinthB 5 14 = '.'
labyrinthB 4 14 = 'T'
labyrinthB x y  = labyrinthA x y

labyrinthC 3 14 = ' '
labyrinthC 4 14 = ' '
labyrinthC x y  = labyrinthB x y
显示迷宫迷宫=

putStrLn$unlines$[[迷宫j i | i您可以使用递归函数执行此操作:

type Labyrinth = Int -> Int -> Char
width :: Labyrinth -> Int
width l = width' 1
  where width' n | l 1 n == 'O' = n-1
                 | otherwise    = width' (n+1)

这是一种相对标准的递归技术。函数
width
使用一个辅助函数
width'
,该函数获取当前列索引(第一次被
width
调用时以
1
开始)。它检查迷宫函数是否在该列返回带有“模式保护”的
'O'
。如果返回,它将返回列的索引,就在
'O'
之前。如果返回不返回,它将递归调用自己以检查下一列。

可能重复您为什么要避免列表?非常感谢。您对练习递归方法有何建议?我对这种编程技术不是很有经验。@Napkin实现
map
filter
foldl
foldr
。实现
init
last
(++)
reverse
。中的大多数函数都可以递归实现。其中还包括大量递归实践。