2017-06-02 21 views
0

私は比較的新しいHaskellです。なぜこれがコンパイルされないのかわかりません。私がしようとしているのは、文字列形式の数値がそれを行うヘルパー関数を作成して回文型かどうかを調べる関数を作成することです。ありがとう!数字が回文であるかどうかを調べる

isPalindrome :: [Char] -> Bool 
isPalindrome s = (helper . Char.digitToInt) s 
    where helper [] = True 
      helper [x] = True 
      helper (x:xs) = x == (last xs) && (helper . init) xs 

エラー:

euler.hs:29:28: error: 
• Couldn't match type ‘Int’ with ‘[a0]’ 
    Expected type: Char -> [a0] 
    Actual type: Char -> Int 
• In the second argument of ‘(.)’, namely ‘Char.digitToInt’ 
    In the expression: helper . Char.digitToInt 
    In the expression: (helper . Char.digitToInt) s 
euler.hs:29:45: error: 
• Couldn't match expected type ‘Char’ with actual type ‘[Char]’ 
• In the first argument of ‘helper . Char.digitToInt’, namely ‘s’ 
    In the expression: (helper . Char.digitToInt) s 
    In an equation for ‘isPalindrome’: 
     isPalindrome s 
     = (helper . Char.digitToInt) s 
     where 
      helper [] = True 
      helper [x] = True 
      helper (x : xs) = x == (last xs) && (helper . init) xs 

答えて

3

digitToIntCharを取り、Intを返すので、それがコンパイルされません。

あなたはそれにリスト(s :: [Char])を与え、その結果を別のリスト(helperがリストを取る)として扱います。

+0

ああ、今すぐ見る!マップを追加すると問題が解決されたようです。早速のご返事ありがとうございます! :) – Ben

+2

@Benなぜ最初に文字を比較することが完全に受け入れられるとき、文字を 'Int'sに変換するのですか?言い換えれば、すでに数字の文字列表現がある場合は、文字列が回文かどうかを確認するだけで十分です。 –

+0

@Benこの場合、何が起こっているのか分かりましたので、エラーメッセージを再度注意深く読むことをお勧めします。私はあなたがそれがかなり(少し冗長であれば)はっきりしていると思います、そしてそれは何度も何度も遭遇するエラーです。また、この質問に回答したことを確認してください – jberryman

関連する問題