我正在编写一个名为printField的函数。此函数将int
和string
作为参数,然后使用此"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的新手和一般的函数式编程。
答案 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 -> Bool
而y
为String
,即[Char]
,所以你需要做一些事情来制作String -> Bool
类型的函数。 Prelude中的all
函数采用类型为a -> Bool
的函数,并返回类型[a] -> Bool
的函数,如果您传递的列表的所有元素都满足您的要求,则返回True
谓语。