0

私は現在、電子ブック Haskell School of Music からこの問題を解こうとしています:

関数のリスト [ f1, f2, ..., fn ] と値 v を指定すると、結果 f1 (f2 (...(fn v)...)) を返す関数 applyAll を定義します。

例: applyAll [シンプル 2 2, (+3)] 5 ⇒ 20

現在、私は持っています

simple       :: Integer -> Integer -> Integer -> Integer
simple x y z = x * (y + z)

applyAll          :: [(f -> a)] -> a -> a
applyAll [f] v  = foldr (.) v [f]

a = (applyAll [simple 2 2, (+3)] 5)
print a

エラーが表示されます:

Couldn't match type `f' with `a0 -> f'
  `f' is a rigid type variable bound by
      the type signature for applyAll :: [f -> a] -> a -> a

Expected type: (f -> a) -> a -> a
  Actual type: (f -> a) -> (a0 -> f) -> a0 -> a
In the first argument of `foldr', namely `(.)'
In the expression: foldr (.) v [f]

型シグネチャと関係があると思いますが、これまで試したことはありません。

4

1 に答える 1