0

我正在编写一个名为 printField 的函数。这个函数接受 anint和 astring作为参数,然后打印一个像这样的字段"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 和函数式编程的新手。

4

2 回答 2

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
于 2013-11-04T15:51:20.997 回答
0

两件事:首先,您不需要调用concat. 其次,您可能想说if all isDigit y- isDigitis of typeChar -> Boolyis a Stringie之类[Char]的东西,因此您需要做一些事情来制作 type 的函数String -> Bool。Prelude 中的all函数接受一个类型函数a -> Bool并返回一个类型函数,如果您传递给它的列表的所有元素都满足您的谓词,则该函数[a] -> Bool返回。True

于 2013-11-04T15:42:41.577 回答