多変量解析のhaskell関数を作成する方法とは?
質問
私は任意の数の引数(すべて同じ型)を取り、それらを使って何かを行い、その後結果を返す関数が必要です。引数のリストは、私の特定のケースでは実用的ではありません。
私はhaskellのライブラリに目を通したとき、私は関数
printf
(モジュールから
Text.Printf
) も同じようなトリックを使っています。残念ながら、ソースを見ただけでは、そのマジックは理解できませんでした。
誰かこれを達成する方法を説明してくれませんか、または少なくとも、これに関する良い説明を見つけることができるいくつかの Web ページ/紙/何でも?
動機は?
私がこれを必要とする理由は、実に単純です。学校(コンピュータサイエンスクラス)では、数式を記録し、それを文字列として表現し(独自のデータ型のためにNum/Realなどのインスタンスを書くことによって)、それに対してさまざまな操作を実行できるモジュールを書くことが要求されます。
このデータ型は変数のための特別なコンストラクタを含んでおり、指定された関数によって値や何かに置き換えることができる。目標のひとつは、このような式をいくつかの変数((Char,Rational)
のペア)を受け取り,式の結果を計算する関数を書くことである.この関数の目標をどのように表現したらよいかを考えてみよう。(私の考え この関数は、関数内で定義されたvarsと正確に同じ数の引数を取る別の関数を返します - 不可能のようです)。
どのように解決するのか?
のキーポイントは
printf
は、文字列か関数のどちらかを返すことができることです。コピー元は
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/src/Text-Printf.html
,
printf :: (PrintfType r) => String -> r
printf fmts = spr fmts []
class PrintfType t where
spr :: String -> [UPrintf] -> t
instance (IsChar c) => PrintfType [c] where
spr fmts args = map fromChar (uprintf fmts (reverse args))
instance (PrintfArg a, PrintfType r) => PrintfType (a -> r) where
spr fmts args = \a -> spr fmts (toUPrintf a : args)
で、抽出できる基本構造は
variadicFunction :: VariadicReturnClass r => RequiredArgs -> r
variadicFunction reqArgs = variadicImpl reqArgs mempty
class VariadicReturnClass r where
variadicImpl :: RequiredArgs -> AccumulatingType -> r
instance VariadicReturnClass ActualReturnType where
variadicImpl reqArgs acc = constructActualResult reqArgs acc
instance (ArgClass a, VariadicReturnClass r) => VariadicReturnClass (a -> r) where
variadicImpl reqArgs acc = \a -> variadicImpl reqArgs (specialize a `mappend` acc)
例えば
class SumRes r where
sumOf :: Integer -> r
instance SumRes Integer where
sumOf = id
instance (Integral a, SumRes r) => SumRes (a -> r) where
sumOf x = sumOf . (x +) . toInteger
であれば
*Main> sumOf 1 :: Integer
1
*Main> sumOf 1 4 7 10 :: Integer
22
*Main> sumOf 1 4 7 10 0 0 :: Integer
22
*Main> sumOf 1 4 7 10 2 5 8 22 :: Integer
59
関連
-
[解決済み] Haskell - Ord aの型は何を意味するのでしょうか?
-
[解決済み] haskellにおけるdrop関数 - リスト内包を用いた実装
-
[解決済み】Haskellの入門編
-
[解決済み] CabalとStackの違いは何ですか?
-
[解決済み] Haskellの関数合成(.)と関数応用($)イディオム:正しい使い方
-
[解決済み] 無限リストでのfoldlとfoldrの動作
-
[解決済み] アプリケートは合成し、モナドは合成しない
-
[解決済み] Haskellのprintfはどのように動作するのですか?
-
[解決済み] Haskellプログラムのパフォーマンス解析ツール
-
[解決済み] mtl、トランスフォーマー、monads-fd、monadLib、そして選択のパラドックス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】haskellでリストを逆順にする
-
[解決済み] .の違いは何ですか?(ドット)と$(ドルマーク)の違いは何ですか?
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み] Haskellにはなぜ "data "と "newtype "があるのですか?重複] [重複] [重複
-
[解決済み] 無限リストでのfoldlとfoldrの動作
-
[解決済み] Haskellデータ型のメモリフットプリント
-
[解決済み] このフィボナッチ関数はどのようにメモされているのですか?
-
[解決済み] HaskellのComonad型クラスとは何ですか?
-
[解決済み] 難読化されたHaskellのコードはどのように動作するのでしょうか?
-
[解決済み] なぜこのHaskellコードは "infinite type "エラーを発生させるのでしょうか?