0

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と関数型プログラミング全般に不慣れであることを覚えておいてください.

4

2 に答える 2

1
isDigit :: Char -> Bool

printField x yあるので、すべてy :: [Char]が数字かどうかを知りたい(数字を作る)。を使用しております Charall 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 に答える