IT練習ノート

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

Haskell

関数のコンテキストの型はユニークに解決される

言われてみれば当たり前なのですが、これに嵌りました。 Num型を複数とる関数があって、Int型やDouble型などいろいろパラメータに与えたかったのですが、コンパイルエラーがとれませんでした。問題点をシンプルな例で示すと以下のようになります。 Num型を複…

Haskellのドット演算子(.)

f . gと書いたときにgの結果がfに渡されるイメージで、Unixの|パイプに例えられます。 *> :t (.) (.) :: (b -> c) -> (a -> b) -> a -> c 表現は正確ではありませんが、渡される結果が「1つ」でなくても、ドット演算子は使えます。 > let f = undefined :: b…

GhcLintでコードをチェックする

結果集計 $ grep "^src" doc/wk_lint_result.md | cut -d " " -f 4- | sort | uniq -c | sort -r 18 error| Suggestion: Move brackets to avoid $ 8 error| Suggestion: Redundant $ 7 error| Suggestion: Redundant bracket 4 error| Suggestion: Avoid la…

HeteroMapのサンプル

a hetero-dict sample

HaskellでFPGAの最小のサンプル

入力を反転するだけのコード Not gate コンパイル $ stack exec -- clash --interactive CLaSHi, version 0.99 (using clash-lib, version 0.99): http://www.clash-lang.org/ :? for help Clash.Prelude> :cd ../worka Clash.Prelude> :! ls Clash01.hs Cla…

Haskellのドキュメント生成

haddockコマンド自体はディレクトリを指定してその配下にあるhsファイルを再帰的に処理してくれるオプションはないようです。xargsを使うのが手っ取り早いようです。 haskell - how to generate documentations with haddock? - Stack Overflow $ find . -na…

Implicit Parameters

Clashのプログラミングでサンプルを作り始めたところ、?変数名 :: 型というシグネチャが出てきました。 *> :t notM notM :: (?rst::Reset domain synchronous, ?clk::Clock domain gated) => Signal domain Bool -> Signal domain Bool Implicit Paremtersと…

2018/01時点のClash

Githubから取得してclashをインストールした場合、2018/01時点では、hackageにあるチュートリアルはのコード動かないようです。 CLaSH.Tutorial tutorialにあるソースをコンパイルするとパッケージがないとのエラーメッセージがでます。 Clash.Prelude> :l M…

clashのインストール (Mac成功 / Windows失敗)

clashのインストールをしています。 www.clash-lang.org Macではインストールができましたが、Windowsではできませんでした。 Macの環境 OS X Yosemite 10.10.5 The Glorious Glasgow Haskell Compilation System, version 8.2.1 stack 1.6.3 x86_64 hpack-0…

stack自体のupdateの作業ログ (2018年01月)

stack buildをすると、cabalのバージョン不整合のエラーがでました。 $ stack build Unable to parse cabal file: FromString "This package requires at least Cabal version 2.0" Nothing 確認すると不整合はなさそうです。 $ cabal --version cabal-insta…

cabal自身のバージョンアップの作業ログ (2018年01月時点)

cabalは2017年8月からバージョンが2になっています。アップデートをサボっていたので更新作業をしまし。 バージョンの確認とパッケージ情報の更新をします。 $ cabal --version cabal-install version 1.24.0.0 compiled using version 1.24.0.0 of the Caba…

2017年12月版 Windows10にHaskellをインストール

ghc,cabal,stackがインストールされます。。msys2も同時にインストールされます。なにも迷うことはありませんでした。むしろキャプチャとっているほうが時間がかかっていたかもしれません。 www.haskell.org

AttoparsecでN文字先読み

lookAhead関数をつかうだけ。 Peek many chars in Attoparsec.

GHCやghciでワーニングを出さない

:set -w です。 stackoverflow.com

Haskellのテスト構成イメージ

こんなイメージ cabal | +--> TestSuite | +--> Tasty | +-(bridge)-> HSpec | | | +-(bridge)-> hspec-attoparsec | +-(bridge)-> QuickCheck 全体概要 unit-test-example/tutorial.md at master · kazu-yamamoto/unit-test-example · GitHub フレームワー…

Attoparsec の parseOnly は 残りにエラーがあったとしても、成功したところまでの結果を成功として返す

全部消費した上で判断したい場合はendOfInputを合成する。 gist.github.com

HUnit と Hspec の比較

gist.github.com

cabalのreplでテストスイートを使う

Haskellのテストをcabalで行う時は、下記のように実行します。(configureは毎回出なくて大丈夫ですが) % cabal configure --enable-tests % cabal build % cabal test テストコードを少し書くごとにcabal buildするのは、テストが蓄積されると時間がかかりま…

Int * Doubleは不可

> let a1 = 2 :: Int > let a2 = 3 :: Int > a1 * a2 6 > let b1 = 2 :: Double > let b2 = 3 :: Double > b1 * b2 6.0 > a1 * b2 <interactive>:1387:6: error: • Couldn't match expected type ‘Int’ with actual type ‘Double’ • In the second argument of ‘(*)’, nam</interactive>…

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

stackoverflow.com

JavaとHaskellのパースの違い

関数のパラメータ部分の解析を考えてみます。例えば、foo(1, 3, 4);の`(1, 3, 4)の部分をパースすることを試してみます。 仕様としては、 先頭にカッコ開き 末尾にカッコ閉じ 間に、カンマ区切りの数値 があるとします。 Javaの場合ですが、com.mysql.cj.xde…

fmapできない型

ProtocolBufferのパッケージ内にUtf8という型があります。 https://hackage.haskell.org/package/protoc… これは、StringBufferで表現されたデータが有効なUtf8であることを示した目印をつけたものです。 この、目印がつけられたデータに対して処理を考えた…

cabalでローカルにあるライブラリを使う

課題 ローカルに自作ライブラリのソースコードがある。 ライブラリ側の変更はない仮定(安定している仮定)。 そのライブラリを使うプログラムをローカルで作りたい。 ライブラリのソースコードとディレクトリは別にするが、cabalプロジェクトを作る。 ライブ…

RealWorld Example を触ってみる

Haskell Servant RealWorld Example App リポジトリの場所 Haskell Servant RealWorld Example App インストール サイトの手順の通り データベース >sqlite3 /tmp/haskell-servant-test.db < {your_path}/haskell-servant-realworld-example-app/scripts/sch…

ServantチュートリアルのBasic認証でIO

http://haskell-servant.readthedocs.io/en/stable/tutorial/Authentication.html チュートリアルだとユーザIDパスワードチェックのコードがハードコードされています。一見、どこでIOできるのかわからなかったので試してみました。 Servant Basic Auth by u…

ServantのルーティングでのIO

ServantでhandlerでのIOの取り回しのサンプルはWebに情報があるのですが、:>で記述していくルーティングでのIOの取り回しがわからず四苦八苦していました。 HasServerという型クラスでルーティングを記述していきますが、このクラス自体にIOが明示的にはない…

ghciの使い方

プロンプトを変える :set prompt "foo>" バンドされている情報を見る :show bindings foo>let x = 123 foo>let y = "abc" foo>:show bindings x :: Num t => t = _ y :: [Char] = _ foo> ロードされているモジュールを確認する :show module foo>:l MyWebApp…

ログのサンプル

a small sample (the smallest ?) of MonadLogger

Polynomialを整形して表示する

Math.PolynomialパッケージのPoly型のShowは内部構造をそのまま文字列表現するので、読みにくいときがあります。そこで、多項式を数式のように表示するサンプルを書いてみました。 polynomial: Polynomials

フェルマーの小定理のテスト

gist.github.com