2

任意の数の引数と整数のリストを持つ関数を受け取り、関数の結果を返す関数 apply を作成したいと考えています (リスト内の各整数は順番に引数です。

私は次のようなことを考えていました:

apply :: ([Int] -> Int) -> [Int] -> Int
apply f x:xs = apply (f x) xs
apply f [] = f

しかし、型シグネチャが間違っているため、これが機能しないことはわかっています。関数は int のリストを使用せず、いくつかの int 引数を使用するだけです。

さらに、基本ケースに到達すると、適用する f 引数は実際には整数である必要があり、とにかく型シグネチャに違反します。

この種の問題に対処する方法を知っている人はいますか?

4

2 に答える 2

11

任意の数の引数と整数のリストを持つ関数を受け取る関数 apply を作成したいのですが、

なぜこれをしたいのですか?引数の構造体はデータ構造体として渡す必要があるかもしれませんが、これまでのところ、慣用的な Haskell ソリューションが生成されないように、問題を過剰に制約してきました。

于 2010-05-10T05:05:40.520 に答える
7

いくつかの派手な型クラスでそれを行うことができます

{-# LANGUAGE FlexibleInstances #-}
-- for ApplyType (Int -> r)

class ApplyType t where
    apply :: t -> [Int] -> Int

instance ApplyType Int where
    apply f _ = f

instance (ApplyType r) => ApplyType (Int -> r) where
    apply f (x:xs) = apply (f x) xs

main :: IO ()
main = do print $ apply ((+) :: Int->Int->Int) [1, 2]
          print $ apply ((\x y z w -> x*y - z`div`w) :: Int->Int->Int->Int->Int) [3,5,8,2]
于 2010-05-10T05:03:33.177 に答える