在haskell中打印带有附加点的字段

时间:2013-11-04 15:21:43

标签: haskell functional-programming

我正在编写一个名为printField的函数。此函数将intstring作为参数,然后使用此"Derp..."打印一个类似此printField 7 "Derp"的字段。当字段由数字组成时,输出应为" ... 3456"。

我写的函数看起来像这样:

printField :: Int -> String -> String
printField x y = if isDigit y 
                 then concat(replicate n ".") ++ y
                 else y ++ concat(replicate n ".")
                 where n = x - length y

这显然不起作用。我从GHC得到的错误是:

Couldn't match type `[Char]' with `Char'
    Expected type: Char
      Actual type: String
    In the first argument of `isDigit', namely `y'
    In the expression: isDigit y
    In the expression:
      if isDigit y then
          concat (replicate n ".") ++ y
      else
          y ++ concat (replicate n ".")

我无法让它工作:(。任何人都可以帮助我吗?请记住,我是Haskell的新手和一般的函数式编程。

2 个答案:

答案 0 :(得分:1)

isDigit :: Char -> Bool

printField x y

我们有y :: [Char],因此您想知道每个 Char是否为数字(制作数字)。我们使用all isDigit y

另外,你做了concat(replicate n ".")

我们有"." :: [Char]replicate :: Int -> a -> [a]

所以replicate 2 "." :: [[Char]]

只需使用'.' :: Char

即可

最终代码为

import Data.Char

printField :: Int -> String -> String
printField x y = if all isDigit y
    then (replicate n '.') ++ y
    else y ++ (replicate n '.')
    where n = x - length y

可以让它更漂亮

import Data.Char

printField :: Int -> String -> String
printField x y = if all isDigit y
    then dots ++ y
    else y ++ dots
    where
        dots = replicate n '.'
        n = x - length y

答案 1 :(得分:0)

两件事:首先,您不需要调用concat。其次,您可能想说if all isDigit y - isDigit类型为Char -> BoolyString,即[Char],所以你需要做一些事情来制作String -> Bool类型的函数。 Prelude中的all函数采用类型为a -> Bool的函数,并返回类型[a] -> Bool的函数,如果您传递的列表的所有元素都满足您的要求,则返回True谓语。