2016-08-31 10 views
-1

Intリストの要素の操作を実行するために2つの関数を 'myfunc'に渡してテストしようとしています。Haskell - 関数に複数の関数を渡す

*これは、テストに純粋である - 私もなど、私はフィルタを使用することができます知っている...ちょうどここ

addone :: Int -> Int 
addone i = i + 1 
addoone _ = 0 

checkeven :: Int -> Bool 
checkeven n 
    | even n == True = True 
    | otherwise  = False 

myfunc :: (Int -> Bool) -> (Int -> Int) -> [Int] -> [Int] 
myfunc ce ao [] = [] 
myfunc _ ao (x : xs) = [] 
myfunc ce _ (x : xs) = [] 
myfunc ce ao (x : xs) = if ce x then ao x : tail else tail where 
    tail = myfunc ce ao xs 

mylist = [1,2,3,3,3,1,1,4] 
main = do 
    let x = myfunc checkeven addone mylist 
    putStrLn $ show x 

コードをテストする「非網羅的なパターン」のこれを実行しようとしたときにエラーを取得します。 .. 何か案は?

パターンが一致したときに、彼らは同じこと(また、彼らはあなたが探している再帰の最終段階ではない)を意味するので、これらの2行は役に立たない てmyfunc
+1

常に完全なエラーメッセージを追加してください。そして、実際にコードをテストしたように投稿してください( 'ctrl-k'を使用してコードブロックにして、インデントを崩さないようにしてください)。 – leftaroundabout

+0

私はあなたがインプラントの2行目を過ぎることはないと思います。 myfuncでは空のリストではない入力と一致し、空のリストは最初の行で一致します。 2つの関数が渡された(ヌルでないのと同じですが)冗長であることを検証しようとしているようです。 – barakcaf

+0

明示的な再帰関数を書き出すのではなく、既存の関数を作成してみてください。 'myfunc ce ao xs = map ao(filter ce xs)'、または単に 'myfunc ce ao = map ao 'です。フィルタce。 – chepner

答えて

3

:最初にも

myfunc _ ao (x : xs) = [] 
myfunc ce _ (x : xs) = [] 

をパターン一致ceaoはどこでも使用されていないので、役に立たないので、_である必要があります。

のでてmyfuncは次のようになります。ここでは

myfunc :: (Int -> Bool) -> (Int -> Int) -> [Int] -> [Int] 
myfunc _ _ [] = [] 
myfunc ce ao (x : xs) = if ce x then ao x : tail else tail where 
    tail = myfunc ce ao xs 
1

は内訳です:

addone :: Int -> Int 
addone i = i + 1 
addone _ = 0 

最初の行はすべてにマッチしますので、最後の行は、ここに余分です。

checkeven :: Int -> Bool 
checkeven n 
    | even n == True = True 
    | otherwise  = False 

これはcheckeven = evenのように記述することができます。

myfunc :: (Int -> Bool) -> (Int -> Int) -> [Int] -> [Int] 
myfunc ce ao [] = [] 
myfunc _ ao (x : xs) = [] 
myfunc ce _ (x : xs) = [] 
myfunc ce ao (x : xs) = if ce x then ao x : tail else tail where 
    tail = myfunc ce ao xs 

行1と一致させる条件は、「リストが空です」です。 2行目と3行目を一致させる条件は、「リストは空ではありません」です。したがって、3行目と4行目は決して一致しません。

REこのエラーは、どこから来るのかわかりません。問題を再現し、エラーメッセージをクリアする完全なコードを投稿してください。

+0

それぞれのコメントは、そのコードをそのコードの下ではなく、それを参照します。 – arrowd

+0

それは私たちの脳が異なって配線されているようだ、次のコメントに気づかなかった:) – Sakamiai

関連する問題