繁体   English   中英

Haskell:递归问题

Haskell: problem with recursion

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试将文本格式设置为矩形。 目前,我已经能够使它正确地左对齐,但是最后一行没有尽可能延伸。

我正在尝试计算最佳字段宽度,以最小化或完全消除此宽度。

我完全被困住了。 下面的代码显示了相关功能。 此刻,它陷入了无限循环。 我要去哪里错了?

附带说明一下,调试Haskell代码的最佳方法是什么? (是的,我对此很陌生。)

optimumFieldWidth应该比较行的长度,直到顶行的长度等于底行的长度,然后返回使之成为真的字段宽度。

module Main where

import System
import Data.List

main = do 
  (f:_) <- getArgs
  xs <- getContents
  putStr (show (bestFieldWidth maxLineLength xs))

bestFieldWidth :: Int -> String -> Int
bestFiledWidth _ [] = 0
bestFieldWidth lineLength xs
  | length (last input) == length (head input) = lineLength
  | otherwise = bestFieldWidth (length (head (rect (lineLength-1) xs))) xs
  where input = lines xs

rect :: Int -> String -> [String]
rect _ [] = []
rect lineLength xs
  | length input <= len = [input]
  | otherwise           = take len input : rect len (drop len input)
  where input = trim xs
        len   = bestFieldWidth lineLength xs

maxLineLength :: Int
maxLineLength = 40

感谢所有答复。 谢谢。

3 个回复

我以为我会把实际的解决方案放在这里,以防任何其他消息者希望这样做。 请记住,它是由白痴编写的,因此它可能不是最优雅的解决方案。

maxFieldWidth :: Int
maxFieldWidth = 30

rect :: String -> String
rect xs  = (unlines (chunk (bestFieldWidth (maxFieldWidth) (lines input)) input))
  where input = itemsReplace '\n' ' ' xs

--Should be called with the point maximum desired width as n
bestFieldWidth :: Int -> [String] -> Int
bestFieldWidth _ [] = error "bestFieldWidth: Empty List"
bestFieldWidth n xs
  | n == 6 = 6
  | 1 == (length (last input)) = n
  | otherwise = (bestFieldWidth (n-1) xs)
  where input = chunk n (unlines xs)

chunk :: Int -> [a] -> [[a]]
chunk n [] = []
chunk n xs = ys : chunk n zs
  where (ys,zs) = splitAt n xs

itemsReplace :: Eq a => a -> a -> [a] -> [a]
itemsReplace _ _ [] = []
itemsReplace c r (x:xs)
  | c == x    = r:itemsReplace c r xs
  | otherwise = x:itemsReplace c r xs

似乎条件length (last input) == length (head input)一旦为false,则在后续对area调用中永远不会变为true,因此使该函数始终采用otherwise分支,并以相同的xs值无限期地调用自身,因此input

造成这种情况的可能原因是,您使用了lines函数,该函数使用换行符分隔字符串,而这种方式不依赖于lineLength且与rect函数中的换行不一致。

为了回答您的旁注,以下是调试Haskell的出色指南: http : //cgi.cse.unsw.edu.au/~dons/blog/2007/11/14

还有Debug.Trace,它允许您插入打印语句。 当然,它只能在调试时使用,因为它会使您的函数产生副作用。

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Debug-Trace.html

1 Haskell递归字典函数问题

我一直在努力学习Haskell,目前正在努力创建一个递归的“字典”或“翻译”功能。 基本上它应该接收一组stings和一个元组或sting的数组,并返回一个字符串数组,如果它与第一个匹配,则元素被元组的第二部分替换。 所以基本上来自 至 制作麻烦......这是我到目前为止所 ...

2 递归Haskell

我试图实现这样的事情: 我知道这段代码是错的,但它只是想法。 如何使用返回递归的最小值来连接其余值。 输入就像 mysort [7,9,3,7,1,2] ...

3 Haskell 递归

我正在努力理解下面代码的逻辑。 我知道代码将返回从第一个到第n个斐波那契数列的列表,例如fib 3将产生[2,1,1,0] 。 我不明白 ' n ' 在(x:y:xs)是如何拆分的。 我将不胜感激。 谢谢 ...

4 Haskell递归问题,微小的解析器。 Expr的否定和表达

我的解析器在完成之前缺少两件事。 从上面的数据类型缺少“Neg Expr”和“Expr Expr Expr”。 第一部分是这样的: 与数据类型一样,Let表达式以let开头并接受三个Expr。 我不知道如何写出这些最后的功能。 任何帮助都将非常感谢。 我确实在这里问了另外 ...

6 Haskell递归查找功能

我的超市库存清单中有以下代码: 仅列出了我,其余的由我自己完成,我希望它是正确的。 现在,我应该构建一个函数findArticle,在其中输入条形码并获取产品的名称和价格。 它应该是一个递归函数,在列表中搜索匹配的条形码。 但是我该怎么做呢? 感谢帮助 ...

7 Haskell-递归/语法

我这里有一些代码,我需要有人向我解释它的作用。 我没有得到 一个-&gt;布尔 和 (像素) 因此,代码遍历列表,如果列表为空,则返回一个空列表。 如果列表不为空,则检查是否(px) 。 如果为true,则使该元素保持不变,并转到列表中的下一个元素 ...

2014-08-22 23:43:42 2 101   haskell
8 Haskell回溯跟踪递归

我在haskell中实现这个。 https://www.cs.bu.edu/teaching/alg/maze/ 当达到“目标”时我能够到达获取列表但是如果目标不可访问,则列表不会更新。 例如 我的代码如下 我没有得到结果。 我是Haskell的新手,任何人都可以 ...

9 Haskell递归列表求和

我是函数式编程和Haskell的新手,所以我只是通过尝试一些Euler问题来开始学习两者。 这涉及大量列表求和。 因此,我尝试编写一个递归列表求和函数,该函数将一个列表作为输入并返回一个整数作为输出,例如: 编译此代码时,我收到此错误: 我已经尝试研究模式匹配,但是我无法 ...

10 让Haskell中的递归

有人可以通过以下输入解释这段代码的行为: [[1,2],[3,4]] ? 结果是一个无限的列表,但我没有意识到为什么。 我明白了诀窍在于: 但是,由于我们没有定义变量v的初始值,所以如何正常工作? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM