スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

どう書く?org F# ピラミッドを作る

「どう書く?org」http://ja.doukaku.org/に挑戦です。  
さて今回の問題はこちら「ピラミッドを作る」http://ja.doukaku.org/8/
 
変わった方法でやってみたいと思ったので、効率は大層悪いと思いますが、無理やり「関数の合成」を使ってみます。
 
まず、同じ関数をn個合成して返す関数を定義します。
 
> let compose f n =
    let rec comSub count resf =
        if count = n then
            resf
        else
            comSub (count + 1) (f >> resf)
    comSub 0 id ;;
 
val compose : ('a -> 'a) -> int -> ('a -> 'a)
 
こうしておいて例えば
> let f1 = compose (fun () -> printf "*") ;;//部分適用
val f1 : (int -> unit -> unit)
とすると
> (f1 5) ();; //5個合成したものを実行
*****val it : unit = ()
となります。
 
次にfをm回実行した後gをn回実行しhをl回実行する関数を返す関数を定義します。
> let repeatEachFunc f m g n h l =
    (compose f m) >> (compose g n ) >> (compose h l);;
 
val repeatEachFunc :
  ('a -> 'a) -> int -> ('a -> 'a) -> int -> ('a -> 'a) -> int -> ('a -> 'a)
  
あとはこれをm nを変えながら合成していけばよいので(lは改行数なので固定で2とします。)
 
> let makeResFunc n =
    let rec comSub2 count resf =
       if count = n then 
         resf
       else
         let tempf = 
            resf >> (repeatEachFunc (fun () -> printf " ") (n - count) 
                                    (fun () -> printf "*") (2*count + 1)
                                    (fun () -> printf "\n")  2 )
         comSub2 (count + 1) tempf
    comSub2 0 id;;
 
val makeResFunc : int -> (unit -> unit)
 
関数を作っては引数の()を与えて実行してみます。
 
> (makeResFunc 3) ();;
   *
 
  ***
 
 *****
 
val it : unit = ()
> (makeResFunc 4) ();;
    *
 
   ***
 
  *****
 
 *******
 
val it : unit = ()
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。