スポンサーサイト

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

F#雑記 plus

anarchy golf の問題http://golf.shinh.org/p.rb?Plusより 
 
>disp '+' ' ' 2;;
  +  
  +  
+++++
  +  
  +  
>disp '+' 'a' 3;;
aaa+aaa
aaa+aaa
aaa+aaa
+++++++
aaa+aaa
aaa+aaa
aaa+aaa
 
と実行される関数を書いてみました。
今回のテーマは「関数のリスト」です。
 
まず次のように引数をサンドイッチしてリスト化する関数を書きます。
> sandwitch 'a' '+' 3 ;;
val it : char list = ['+'; '+'; '+'; 'a'; '+'; '+'; '+']
 
コードは次です。
> let sandwitch core side n =
    let notCore = [for i in 1 .. n -> side]
    notCore @ [core] @ notCore ;;
 
val sandwitch : 'a -> 'a -> int -> 'a list
 
実際に使う場合は関数を要素とするので2種類の関数を引数にしてそれをサンドイッチ状にした上で実行する関数を定義しておきます。
コードは次です。
 
> let sandwitchFunc fc fs m () =
    let funcs = sandwitch fc fs m     
    List.iter (fun f -> f()) funcs //リスト内の関数それぞれに()を与えて実行
  ;;
 
val sandwitchFunc : (unit -> unit) -> (unit -> unit) -> int -> unit -> unit
 
実行例
> sandwitchFunc (fun () -> printf "+") (fun() ->printf "-") 3 ();;
---+---val it : unit = ()
 
あとは、これを利用して、まず行単位の表示をつくり、さらにもう一度利用して全体の表示を作ります。
> let disp c1 c2 n =
    let f1 () = printf "%c" c1
    let f2 () = printf "%c" c2
    let udPrintLine () =
        sandwitchFunc f1 f2 n () ; printf "\n"//改行を付け加えておく
    let mPrintLine () =
        sandwitchFunc f1 f1 n () ; printf "\n" //改行を付け加えておく  
    sandwitchFunc mPrintLine udPrintLine n ()  ;;
 
val disp : char -> char -> int -> unit
 
実行例
> disp '+' ' ' 2;;
  +  
  +  
+++++
  +  
  +  
val it : unit = ()
 
効率はよくありませんが、高階関数の練習ということでご勘弁を。
 
**********************以下コード*************************************
 
let sandwitch core side n =
    let notCore = [for i in 1 .. n -> side]
    notCore @ [core] @ notCore 
 
let sandwitchFunc fc fs m () =
    let funcs = sandwitch fc fs m     
    List.iter (fun f -> f()) funcs //リスト内のunit->unit型の関数それぞれに()を与えて実行
   
let disp c1 c2 n =
    let f1 () = printf "%c" c1
    let f2 () = printf "%c" c2
    let udPrintLine () =
        sandwitchFunc f1 f2 n () ; printf "\n"
    let mPrintLine () =
        sandwitchFunc f1 f1 n () ; printf "\n"  
    sandwitchFunc mPrintLine udPrintLine n ()    
    
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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