IT練習ノート

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

Haskell

関数合成と関数適用の練習

f g g . f g f 補足 1 a -> b c -> d a -> c d 2 a -> b -> c d -> e -> f a -> e -> f e -> f 3 a -> (b -> c) d -> e -> f 2と同じ 4 (a -> b) -> c d -> e -> f (a -> b) -> e -> f e -> f 5 a -> b -> c d -> (e -> f) a -> e -> f e -> f 6 a -> b -> c…

フェルマーの小定理(P=11)

フェルマーの小定理 - Wikipedia n 0 1 2 3 4 5 6 7 8 9 10 n2 0 1 4 9 5 3 3 5 9 4 1 n3 0 1 8 5 9 4 7 2 6 3 10 n4 0 1 5 4 3 9 9 3 4 5 1 n5 0 1 10 1 1 1 10 10 10 1 10 n6 0 1 9 3 4 5 5 4 3 9 1 n7 0 1 7 9 5 3 8 6 2 4 10 n8 0 1 3 5 9 4 4 9 5 3 1 n…

lengthを使わないでリストを2分割する

リストを2分割する方法 対象となる配列をコピーして(a)と(b)として2つ用意する。 以下の(a),(b)を繰り返し処理する。 (a)1つ目は先頭の要素を取得してしてconsする。残りを次の繰り返しのインプットにする。 (b)2つ目は先頭と次の要素を取得して捨てる。残…

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 (R…

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). なんて書いてあります。F…

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 ->…

Windows環境にpcre-lightをインストールで嵌る

Windows環境のHaskellで正規表現ライブラリを利用したかったので、prce-lightをインストールしようとしたら、嵌ってしまいました。 まさに、このRedditで書かれていることと同じエラーでした。 Configuring pcre-light-0.4.0.4...Cabal-simple_Z6RU0evB_2.4.…

Haskellでお手軽お絵かき

CodeWordで手軽にお絵かきができます code.world Haskell Code モード ブロックモード

hs-bootファイルとは何か

Haskellのライブラリのコードを見ていると、まれに、hs-bootという拡張子がついたファイルを見かけることがあります。なんだろうと思っていたのですが、モジュールインポートで相互参照を解決するために使用するようです。 10.8. Filenames and separate com…

filter + map = mapMaybe

ghcでfusionしてくれそうな気もするが、どうなんだろう。 参考リンク Code smell: Boolean blindness | RV Blog Data.Witherable 11.1. Language options — Glasgow Haskell Compiler 8.9.0.20190425 User's Guide

io-streamでストリームを変更する

Generatorを作る必要があります。 以下のようにしてしまうと、固定値を永遠に流すストリームになってしまいます。 badFunc :: InputStream Int -> IO (InputStream Int) badFunc s = do v <- S.read s case v of Just x -> makeInputStream $ return $ Just …

ファイルに行番号をつける

io-streamでinputstreamを作りつなげるだけ。 is-stream sample

variantの小さなサンプルを書いてみた

extensibleパッケージのvariantの使い方を確認するために小さなサンプルを書いてみました。 やりたいことは、 data A = AX | AY deriving (Show, Eq) data B = BY | BZ deriving (Show, Eq) と定義したときに、AとBを合わせたデータ(構造)を(簡単に)定義…

catamorphism, anamorphism, histmorphism, dynamorphismの概要をつかむ記事

45deg.github.io 個人的に慧眼だったのは、不動点の節の説明での発想の転換の部分でした。 そもそもリストを関手で表現したいならば、こう定義した方がよさそうに見えます。 (2) List:=1+Int×List しかしこれでは定義自身にList が含まれる、いわゆる再帰的…

Lensの全体像を簡潔に理解するための記事

LensのOpticsはいろいろあって混乱してくるけど、この記事は、いい感じに細かいところを捨象しているところが素晴らしい。 titech-ssr.blog.jp

extensibleの小さなサンプルを書いてみた

モナドのスタックの取り回しが面倒に感じているので、そろそろ何とかしたいと思っていました。ここでようやく重い腰を上げて、extensibleにチャレンジです。ウェブ上にある情報は、複雑だったので、もっと小さなサンプルを書き下してみました。 mtlとcompati…

Unfoldの使いどころ

haskellのコーディングでfoldrは頻繁に使う印象がありますが。その双対(で、あってるのかな?)のunfoldは、あまり使わない印象があります。というか、使いどころのイメージがつかめませんでした。 この前、n進数間の変換に使えることに気づきました。 が、…

Data.BinaryのputとputByteString

ByteStringがBinaryクラスのインスタンスになっているので、putとputByteStringは同じものかと思ったのですが、差がありました。 Data.Binary > runPut $ put $ BSL.pack [0xFF,0xFE,0xFD] "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ETX\255\254\253" > runPut $ putLa…

Haskellのerrorで嵌る

次のような作りかけのコードを書いていました。errorの部分はあとで修正していくつもりでした。コーディングが進んで、errorの部分をコーディングする段階に来たのですが、show tの内容が出力されませんでした。 paramMetaData2TypeString_ (VAR tipe len) =…

Haskellの時間で嵌る

UTCTimeはDayと`DiffTimeから構成されます。DiffTimeはドキュメントに0 <= t < 86401sの範囲と記載されていますが、範囲以上でも動いてしまうようです。 > y = secondsToDiffTime 60 * 60 * 24 > z2 = UTCTime (fromGregorian 2018 11 17) y > z2 2018-11-17…

重複したフィールドラベル

今の手元の環境は下記なのですが、 > :! stack ghc -- --version The Glorious Glasgow Haskell Compilation System, version 8.2.2 下記のブログ記事をコピペして手元で動作させたらコンパイルエラーになりました。 d.hatena.ne.jp IsLabelクラスのfromLabe…

HaskellのshiftLではまった話

数値リテラルで計算すると期待する結果になるけど、なぜかバインドした値を使うと結果が異なり、しばらく悩みました。 > a 10 > b 149 > c 91 > a `shiftL` 16 .|. b `shiftL` 8 .|. c -- 期待していない結果 91 > 10 `shiftL` 16 .|. 149 `shiftL` 8 .|. 91…

いつも忘れるのでHaskellのテストの最小のひな型をメモ

package.yaml tastyだけでなくtastyから利用するテストパッケージもdependenciesに追加する。(これを忘れていつも嵌る) tests: testproj-test: main: Test.hs source-dirs: test ghc-options: - -threaded - -rtsopts - -with-rtsopts=-N dependencies: - …

Haskellタプルは実質15個まで

タプルでshowやeqが定義されているのは15個まで タプル15個 > type Foo = (Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool, Bool) > (True, False, True, True, True, True, True, True, True, True, True, True, Tru…

HaskellのBitの取り扱い

処理の流れ Binary.BitsからBinaryに直してBinary側でrunする。 パッケージで言えば Data.Binary.Bits.Put -> Data.Binary.Put -> Data.ByteString.Lazy Data.Binary.Bits.Get -> Data.Binary.Get -> Data.ByteString.Lazy 動作例 > BL.writeFile "work\\bit…

QuickCheckで固定長文字列を作る

*> sample' (vectorOf 4 $ choose ('a','z')) ["jvnv","ylqf","aoud","bdha","lekn","ahoy","yzdp","nyso","zzlo","gjii","cyjg"] Ascii文字列とかUnicode文字列とか生成する機能があります。一度しっかりドキュメントを読んでおくとお釣りか来る感じ。 *> s…

CPS

CPSによる階乗計算 > :{ | fac 0 k = k 1 | fac n k = fac (n-1) $ \res -> k $ (*) n res | :} > fac 3 id 6 > fac 3 (+1) -- (1 * 2 * 3) + 1 7 手計算してみる。 fac 3 k = fac 2 $ \res -> k $ (*) 3 res = fac 1 $ \res1 -> (\res -> k $ (*) 3 res) $ …

stackのghciをテスト側で開く

通常のghciで開くとlibまたはexe側でghciが開く $ stack ghci テスト側で開きたい時はテストスイート名を明示的に指定する。 $ stack ghci :RFC5646-test

stackでテストスイートを個別に実行する

name: hoge tests: foo-test: main: Spec.hs source-dirs: test bar-doctest: main: test/doctests.hs と2つのテストスイートfoo-testとbar-doctestを定義する。 このときstack testでテストが実行されるが、両方とも実行される。 片方だけ実行したい場合は …

Attopersecで正規表現{min,max}

Regrex {min, max} for Attoparsec