lengthを使わないでリストを2分割する
リストを2分割する方法
対象となる配列をコピーして(a)と(b)として2つ用意する。 以下の(a),(b)を繰り返し処理する。 (a)1つ目は先頭の要素を取得してしてconsする。残りを次の繰り返しのインプットにする。 (b)2つ目は先頭と次の要素を取得して捨てる。残りを次の繰り返しのインプットにする。 終了条件は、(b)が要素なしになった場合 この時、(a)の残りを、分割する後半部分にする。(a)のconsを処理し、これを分割する前半部分とする。
(a),(b)でリストが小さくなっていくが、(a)は1つずつ、(b)は2つずつ減っていく。
go [a, b,c,d,e,f] [a,b,c,d,e,f] = go (a:[b,c,d,e,f]) (_:_:[c,d,e,f]) = first (a:) (go [b, c,d,e,f] [c,d, e,f] ) = first (a:) (go (b:[c,d,e,f]) (_:_:[e,f])) = first (a:) (first (b:) (go [c, d,e,f] [e,f ] )) = first (a:) (first (b:) (go (c:[d,e,f]) (_:_:[]))) = first (a:) (first (b:) (first (c:) (go [d,e,f] [] ))) = first (a:) (first (b:) (first (c:) ( [], [d,e,f]))) = first (a:) (first (b:) ([c],[d,e,f])) = first (a:) ([b, c],[d,e,f]) = ([a, b, c],[d,e,f])
Choiceを理解するために
http://hackage.haskell.org/package/profunctors-5.5/docs/src/Data.Profunctor.Choice.html#Choice
(->)はChoiceのインスタンスなので、
> left' chr (Left 65) Left 'A' > left' chr (Right 65) Right 65 > right' chr (Left 65) Left 65 > right' chr (Right 65) Right 'A' >
この場合、left'の場合は、Leftのときは関数適用して、Rightのときは何もしない。right'はその逆
Star (a.k.a UpStar) の理解のために
むかしはUpStar/DonwStarといっていたが、最新ではStar/CoStarとなっている。
http://hackage.haskell.org/package/profunctors-5.5.1/docs/src/Data.Profunctor.Types.html#Star
Lift a 'Functor' into a 'Profunctor' (forwards).
なんて書いてあります。Functorを持ち上げてProfunctorにしてくれるとのこと。
fmapしか使えなかったのが、dimapも使えるようになるという雑な理解をする。
例のための例になりますが、具体的なStarを作ってみる。
> :t Star Star :: (d -> f c) -> Star f d c > :t Just Just :: a -> Maybe a > :t Star Just Star Just :: Star Maybe c c >
つかってみる。
> runStar (Star Just) 65 Just 65 > runStar (Star Just) 'a' Just 'a' > runStar (Star Just) "#" Just "#"
もともとFunctorだったから、fmapが使えるはず。
> :t fmap chr (Star Just) fmap chr (Star Just) :: Star Maybe Int Char > :t runStar $ fmap chr (Star Just) runStar $ fmap chr (Star Just) :: Int -> Maybe Char > runStar (fmap chr (Star Just)) 65 Just 'A'
素(?)のfmapとたいひさせると、
> fmap chr (Just 65) Just 'A' > :t fmap chr . Just fmap chr . Just :: Int -> Maybe Char
dimapが使えるか確認
> :t dimap chr show (Star Just) dimap chr show (Star Just) :: Star Maybe Int String > runStar ( dimap chr show (Star Just) ) 65 Just "'A'" >
Applicativeの使い方
Functor: コンテキスト中で1パラメータの関数を適用する。 (a -> b) -> f a -> f b
Applicative: コンテキスト中で2パラメータの関数を適用する。(実際はFunctorと一緒に使う) (a -> b -> c) -> f a -> f b -> f c
> :t (<$>) (<$>) :: Functor f => (a -> b) -> f a -> f b -- (a -> b)は1パラメータの関数 > :t (<*>) (<*>) :: Applicative f => f (a -> b) -> f a -> f b >
Functorのbをb -> cに置き換える。Applicativeのaをb、bをcに置き換える。<$>と<*>をならべてみると、f(b -> c)がキャンセルできることがわかる。
(<$>) :: (a -> (b -> c)) -> f a -> f (b -> c) -- (a -> b -> c)は2パラメータの関数 (<*>) :: f (b -> c) -> f b -> f c
<$>と<*>を適用し、その結果の型を書く
(a -> b -> c) <$> f a :: f (b -> c) f (b -> c) <*> f b :: f c
f (b->c)をキャンセルする。
(a -> b -> c) <$> f a <*> f b :: f c
整理する。
(a -> b -> c) <$> f a <*> f b :: f c
確認する。
> :t \g x y -> g <$> x <*> y \g x y -> g <$> x <*> y :: Applicative f => (a1 -> a2 -> b) -> f a1 -> f a2 -> f b >
余談
Fanctorを1個、ApplicativeをN個とかんがえると、Lensが1個だけ、Traversalが0~N個となることが何となくイメージできる。
type Traversal' a b = forall f . Applicative f => (b -> f b) -> (a -> f a) type Lens' a b = forall f . Functor f => (b -> f b) -> (a -> f a)
Windows環境にpcre-lightをインストールで嵌る
Windows環境のHaskellで正規表現ライブラリを利用したかったので、prce-light
をインストールしようとしたら、嵌ってしまいました。
まさに、このRedditで書かれていることと同じエラーでした。
Configuring pcre-light-0.4.0.4...Cabal-simple_Z6RU0evB_2.4.0.1_ghc-8.6.5.exe: The pkg-config package 'libpcre'is required but it could not be found.
このRedditの記事によると、prce
がインストールされているパスに環境変数を通せば解決したとのこと。しかし、私の環境ではうまくいきませんでした。
試行錯誤して、最終的たどり着いたのは、本家のGithubリポジトリのこのissueでした。
msys2のpacman
の情報を最新化して、pcre
とpkg-config
を最新化することでした。
問題に出会った時の、情報の検索の仕方として、やみくもにキーワードで検索するのではなく、本家情報を確認する必要がありますね。
蛇足ですが、pacmanのアップデートで失敗しましたが、エラーログに書かれていたファイルを直接削除して、再度アップデートしたらうまくいきました。(この時のログは取り忘れ)
WordPressを触ってみた
WordPressの本家サイト。
参考書籍
1章が簡単に歴史がまとまっていて参考になります。4章にPHPプログラミングがあって、入門書のようにも思えますが、5章はAWSでスケーラブルなWordPressと、6章にWordPressユーザのためのNgnix入門などのインフラ面の解説が充実しています。
WordPressプロフェッショナル養成読本 [Webサイト運用の現場で役立つ知識が満載! ] (Software Design plus)
- 作者: 高野直子,後藤賢司,染谷昌利,岡本雄樹,深海寛信,岡本渉,松本悦宜
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/16
- メディア: 大型本
- この商品を含むブログ (1件) を見る
WordPressやるなら定番の書籍なのでしょうか。追加していくコードとサイトの画像が対比されていて読みやすいように思えました。
本格ビジネスサイトを作りながら学ぶ WordPressの教科書
- 作者: プライム・ストラテジー株式会社
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2012/03/30
- メディア: 大型本
- 購入: 7人 クリック: 299回
- この商品を含むブログ (12件) を見る
こちらは上記のスマフォ版です。1ソースでPCとSP両方対応する内容かと思ったのですが、ざっと読んだところ、PCとSPでファイルを分ける(実際はフォルダごとわかれている)ようでした。
本格ビジネスサイトを作りながら学ぶ WordPressの教科書2 スマートフォン対応サイト編
- 作者: プライム・ストラテジー株式会社
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2013/12/14
- メディア: Kindle版
- この商品を含むブログを見る
WordPressを触ってみた感想です。
コミュニティを育てる姿勢が素晴らしい
管理画面のデフォルトに直近のイベントが表示されていて、コミュニティを盛り上げていく姿勢が感じられました。最近11/1, 11/2にWardCampというイベントが日本であったようです。
カスタマイズが柔軟
テーマがたくさん公開されていて、それらのテーマを「外観」->「テーマエディタ」からさらにカスタマイズができます。functions.phpが直接管理画面で改竄変更できるので、基本的には何でもありなような気がします。
PHPコード上にて、JavaScriptをインラインで仕込めば、応用が広がります。
function hoge_enqueue_scripts() { $script = <<<SCRIPT jQuery(function($) { $(document).ready(function() { // ここにJavaScriptコードを書く }); }); SCRIPT; wp_add_inline_script( 'jquery-core', $script, 'after' ); } add_action( 'wp_enqueue_scripts', 'hoge_enqueue_scripts' );
メンテナンスが大変そう
管理画面上から様々な設定ができるのがWordPressの一番のメリットですが、開発スピードはなかなか上がらないかなと感じました。
また、本番リリース後のメンテナンスが大変なような気がしました。開発(or 検証)環境で確認して、本番環境に反映させる標準的な方法があるかと検索してみると、問題はあるようです。(とういうかWordPressの問題というよりは、CMS自体の宿命のような気もしますが、どうなんでしょう。)誰かが作成したWordPressサイトを後からメンテするのは相当大変なんじゃないかなと思いました。