トップ «前の日記(2004-12-27) 最新 次の日記(2004-12-29)» 月表示 編集

日々の流転


2004-12-28 [長年日記]

λ. 可変長引数の関数?

multi-parameter class を使って可変長引数っぽいことが出来ないかと思って、ちょっと試してみた。引数の型を明示する必要があるのがイヤだな。


class VAFun arg result x | x -> result where
    collectVAList :: ([arg] -> result) -> [arg] -> x

instance VAFun arg Int Int where
    collectVAList k xs = k (reverse xs)

instance VAFun arg result x => VAFun arg result (arg -> x) where
    collectVAList k xs x = collectVAList k (x:xs)

withVAList :: VAFun arg result x => ([arg] -> result) -> x
withVAList k = collectVAList k []

vaSum :: VAFun Int Int x => x
vaSum = withVAList sum
*Main> vaSum

<interactive>:1:
    No instance for (VAFun Int Int x)
      arising from use of `vaSum' at <interactive>:1
    In the definition of `it': it = vaSum
*Main> vaSum :: Int
0
*Main> vaSum 3 2 :: Int

<interactive>:1:
    No instance for (VAFun Int Int (t -> t1 -> Int))
      arising from use of `vaSum' at <interactive>:1
    When checking the type signature of the expression:
          vaSum 3 2 :: Int
    In the definition of `it': it = vaSum 3 2 :: Int
*Main> vaSum (3::Int) (2::Int) :: Int
5

[追記] collectVAListではなくwithVAListをVAFunのメソッドにしてしまえる。ytsの日記(2005-01-02) を参照のこと。

Tags: haskell