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で
常に完全なエラーメッセージを追加してください。そして、実際にコードをテストしたように投稿してください( 'ctrl-k'を使用してコードブロックにして、インデントを崩さないようにしてください)。 – leftaroundabout
私はあなたがインプラントの2行目を過ぎることはないと思います。 myfuncでは空のリストではない入力と一致し、空のリストは最初の行で一致します。 2つの関数が渡された(ヌルでないのと同じですが)冗長であることを検証しようとしているようです。 – barakcaf
明示的な再帰関数を書き出すのではなく、既存の関数を作成してみてください。 'myfunc ce ao xs = map ao(filter ce xs)'、または単に 'myfunc ce ao = map ao 'です。フィルタce。 – chepner