IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

大文字小文字を区別せずにパースする

stackoverflow.com

JavaとHaskellのパースの違い

関数のパラメータ部分の解析を考えてみます。例えば、foo(1, 3, 4);`(1, 3, 4)の部分をパースすることを試してみます。

仕様としては、

  • 先頭にカッコ開き
  • 末尾にカッコ閉じ
  • 間に、カンマ区切りの数値

があるとします。

Javaの場合ですが、com.mysql.cj.xdevapi.ExprParserから引用してみました。whileループを使って、間に情報がない場合を場合分けしています。

List<Expr> parenExprList() {
     List<Expr> exprs = new ArrayList<>();
     consumeToken(TokenType.LPAREN);
     if (!currentTokenTypeEquals(TokenType.RPAREN)) {
         exprs.add(expr());
         while (currentTokenTypeEquals(TokenType.COMMA)) {
             consumeToken(TokenType.COMMA);
             exprs.add(expr());
         }
     }
     consumeToken(TokenType.RPAREN);
     return exprs;
}

Haskellの場合ですが、Attoparsecライブラリを使ったコードになります。上で言葉で書いた仕様に近いコードになります。

parenExprList :: Parser [PEx.Expr]     
parenExprList = do
  char '('
  x <- sepBy xParse $ char ','
  char ')'
  return x

調べてないですが、Javaでもライブラリを使えばHaskellと似た様に書けるのかもしれません。

fmapできない型

ProtocolBufferのパッケージ内にUtf8という型があります。

https://hackage.haskell.org/package/protoc…

これは、StringBufferで表現されたデータが有効なUtf8であることを示した目印をつけたものです。

この、目印がつけられたデータに対して処理を考えた時に、

1. 目印を剥がして、
2. 処理をして、
3. また目印をつける

というのは面倒です。

fmapはコンテナの内部に直接働きかけることができます。しかし、単に目印をつけた型の場合はfmapが定義できません。

カインドを確認すると

 > :k Maybe
Maybe :: * -> *
 > :k PB.Utf8
PB.Utf8 :: *
 >

です。

なので、Utf8Functorにしようとするとコンパイルエラーとなります。

 > instance Functor PB.Utf8 where fmap = undefined

<interactive>:297:18: error:
    • Expected kind ‘* -> *’, but ‘PB.Utf8’ has kind ‘*’
    • In the first argument of ‘Functor’, namely ‘PB.Utf8’
      In the instance declaration for ‘Functor PB.Utf8’
 >

目印を剥がして、付け直す仕組みはどうすればいいのか??

作業ログ

git

gitignoreまとめ - maeharinの日記

unsigned int converter

Unsigned integer (32-bit) Converter

よくある名前

Most common last names in the United States, top 1000

作業ログ

mysql のインストール アンインストール

mac OS XにHomeBrewでmysqlインストール。からの設定(mysql_install_db、mysql_secure_installation、my.cnf)やらアンインストールやら - tweeeetyのぶろぐ的めも

SSL

SSL/TLS(SSL3.0~TLS1.2)のハンドシェイクを復習する - Qiita

証明書

X.509証明書の検証手順とありがちな脆弱性 - Qiita

HaskellでHeteroなListを構築する

Heteroリストをfoldrでつくる

下記の実装のようにforlrでリストを作ることができるが、同様なことをHeteroなリストを作りたい。

http://hackage.haskell.org/package/base-4.5.0.0/docs/src/Data-Foldable.html#toList

作業ログ

Haskell

パッケージの雛形

Haskeleton: a Haskell project skeleton · taylor.fausak.me

Free Monadのリンク

Free Monads