clock2019-09-01

【サンプルpdfあり】技術書典7にて圏論入門小説を頒布します!【え20C】

概要

技術書典7にて、圏論入門小説を頒布します!(え20C)

  • タイトル: せつラボ 〜圏論の基本〜
  • ページ数: 128p 158p!(第二版につき増量!)
clock2019-02-08

List<Either<E, A>>からEither<List<E>, List<A>>を取らない

List<Either<E, A>>から「全てのleft値 or 全てのright値」を取るときは、左にNonEmptyList<E>をかけること。

結論

Either<List<E>, List<A>>ではなくEither<NonEmptyList<E>, List<A>>

clock2018-07-25

Happyの%tokenではより一般的な形式を下にしなきゃだめ

正誤

正しい

%token
  ...
  ...
  natType  { (TokenAnIdent "Nat", _)   }
  boolType { (TokenAnIdent "Bool", _)  }
  ident    { (TokenAnIdent $$, _)      }

誤り

%token
  ...
  ident    { (TokenAnIdent $$, _)      }
  ...
  natType  { (TokenAnIdent "Nat", _)   }
  boolType { (TokenAnIdent "Bool", _)  }

これはhappy製の単純型付きラムダ計算パーサーの、トークン宣言部です。

clock2018-06-20

ScopedTypeVariables下の1ランク多相で型が合わないとき

まとめ

 forallを指定してあげると、一連のa, bが固定されてくれます。

f :: forall a b. Eq b => (a -> b) -> (a -> b) -> a -> Bool

解説

clock2018-05-26

HaskellerだけどBoothにマッハ新書出してみた(矢澤にこ先輩と一緒にモナドモナド!)

宣伝

 今流行りの(?)マッハ新書に「矢澤にこ先輩と一緒にモナドモナド!」を出品してみました!

clock2018-02-11

IdrisとHaskellの差異「依存型のパターンマッチが可能」

 Idrisに入門中なので、せっかくだからHaskellではできなかったけどIdris…

clock2018-02-04

Haskellのdoctest (ghci) の:{..:}中のletでincorrect indentation

こんな感じのdoctestを書いていると怒られた 😭

-- >>> :{
-- >>> let result = "good"
-- >>> "good"
-- >>> :}
-- "good"
### Failure in Foo.hs:364: expression `:{
 let result = "good"
 "good"
:}'
expected: "good"
 but got:
          <interactive>:436:2: error:
              parse error (possibly incorrect indentation or mismatched brackets)

let式を使うと(letにin…

clock2018-01-23

1 == "x" が違法だなんて誰も言ってない!

前提

例えばJavaを例に上げると、全てのclassはObjectを継承しており、Object…

clock2018-01-01

数値をnewtypeした型の値として数値リテラルを使う

 Num型クラスに対してGeneralizedNewtypeDeriving拡張を使うことができるので、 例えばIntのnewtype…

clock2017-11-08

Haskell(GHC)のimport/module構文に表れるのtypeキーワードについて(ExplicitNamespaces)

 例によるGHC Haskellの中の概念の紹介記事。


 GHCのHaskellでは(おそらく主に)DataKinds拡張を用いる場合にて、以下のように import/module構文内でtype

clock2017-11-07

Haskell(GHC)のSymbol/Natカインドの型を値に落とす方法

 Haskell(GHC)では以下のように、文字列を型として埋め込むことができます。

{-# LANGUAGE DataKinds #-}

type Str = "sugar"

main :: IO ()
main = return ()

 こうすれば値"sugar" :: String

clock2017-11-03

haskell-stackにlibHSyaml-0.8.24-2wdOOQKc6Dt63OCZo8Nf1H-ghc8.2.1.soがないとか言われた

起こった問題

$ stack
stack: error while loading shared libraries: libHSyaml-0.8.24-2wdOOQKc6Dt63OCZo8Nf1H-ghc8.2.1.so: cannot open shared object file: No such file or directory

結論

 以下のコマンドで解決できる。

$ yaourt -U /var/cache/pacman/pkg/stack-1.4.0-37-x86_64.pkg.tar.xz
$ yaourt -S haskell-stack-git
# PKGBUILDの編集で、依存関係からtlibinfoとstackを消す

事の流れ

 あることのために、ArchLinuxにstatic-stackというhaskell-stack-git

clock2017-10-29

lens(のMonadState演算子など)で自己に言及したい時はidを使う

まとめ

 lensにて。 例えばInt[Int]のような単一の状態を持つMonadState

clock2017-10-12

NonEmptyのIsListインスタンスの損なわせる型健全性

結論

 OverloadedListsNonEmptyを具体化しない方が良い。

概要

In haskell-jp slack

igrep [18:25]
OverloadedLists, 意外と怖いですね。うっかりNonEmpty…

clock2017-09-27

haskell-stackで `collect2; エラー; ldはステータス1で終了しました` が出た場合の対処

 先日yaourt -Syuuすると、haskell-stackのプロジェクトがビルドできなくなった。

$ cd {a-stack-project} && stack build
Configuring clock-0.7.2...
Building clock-0.7.2...
Preprocessing library clock-0.7.2...
/tmp/stack19865/clock-0.7.2/Clock.hsc:44:0: 警告: "hsc_alignment" が再定義されました
/tmp/stack19865/clock-0.7.2/In file included from .stack-work/dist/x86_64-linux-tinfo6-nopie/Cabal-1.24.2.0/build/System/Clock_hsc_make.c:1:0:
/home/aiya000/.stack/programs/x86_64-linux/ghc-tinfo6-nopie-8.0.2/lib/ghc-8.0.2/template-hsc.h:88:0: 備考: ここが以前の宣言がある位置です
#define hsc_alignment(t...) \

/bin/ld: .stack-work/dist/x86_64-linux-tinfo6-nopie/Cabal-1.24.2.0/build/System/Clock_hsc_make.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object。 -fPIC を付けて再コンパイルしてください。
/bin/ld: 最終リンクに失敗しました: 出力に対応するセクションがありません
collect2: エラー: ld はステータス 1 で終了しました

 Haskell…

clock2017-08-23

ネストした分岐を消す方法(タプルを使う)

 まずはこのコードを見て欲しい。

import Numeric.Extra (intToDouble)

main :: IO ()
main = do
  n <- (readLn :: IO Int)
  xs <- sequence $ replicate n (readLn :: IO Int)
  if n == 3
     then case divTotal xs of
               Just result -> putStrLn $ "succeed: " ++ show result
               Nothing     -> putStrLn "The caluculation is failed"
     else putStrLn "x("

divTotal :: [Int] -> Maybe Int
divTotal [] = Nothing
divTotal xs =
  let (x':xs') = map intToDouble xs
  in truncate <$> foldr (flip (/?)) (Just x') xs'
  where
    -- Safe (/)
    (/?) :: Maybe Double -> Double -> Maybe Double
    Nothing /? _  = Nothing
    Just 0  /? _  = Nothing
    Just x  /? y  = Just $ x / y

これは最初にユーザから整数値nの入力を受け取ってから、n…

clock2017-08-22

extensible-effectsの作用を拡大方向に変換する

作用とは

 この記事ではEff型の第一型引数を指します。

-- Fooは作用
Eff Foo a

拡大とは

 この記事において、作用Aが作用B

clock2017-07-28

typeでは型引数を省略しないと高階型クラスインスタンスにできない

class Foo (a :: * -> *)

 のように、高階型に実装されることを要求する型クラスに対して

data Bar a = Bar Int a
type Baz a b = Either (Bar a) b

のようにすると

class Foo (Baz a)

clock2017-07-22

にこ、希と一緒に学ぶHaskell(番外)「extensible-effectsの基本作用」 +絵里

せーのっ

希・絵里「にこ(っち)、ハッピーバースデー!♡」

🎉 パパーン!!

にこ「わ……」


clock2017-07-20

見た目がひどい型をTypeOperatorsで改善したらロジックと同じ見た目になった

before

myLayoutHook :: Choose (ModifiedLayout Gaps (Choose (ModifiedLayout (Decoration TabbedDecoration DefaultShrinker) (ModifiedLayout (Sublayout Simplest) TwoPane)) Grid)) Full Window
myLayoutHook = (taskbarMargin $ twoTabbedPane ||| Grid) ||| Full
  where
    taskbarMargin = gaps [(D, 40)]
    twoTabbedPane = subTabbed $ TwoPane (1/55) (1/2)

after

infixr 1 :$
type (:$) = ModifiedLayout

type (:.) x y z = x :$ (y :$ z)

infixr 2 :|||
type (:|||) = Choose

type MyLayoutHook  = (TaskbarMargin :$ TwoTabbedPane :||| Grid) :||| Full
type TaskbarMargin = Gaps
type TwoTabbedPane = SubTabbed TwoPane
type SubTabbed x   = (Decoration TabbedDecoration DefaultShrinker :. Sublayout Simplest) x

myLayoutHook :: MyLayoutHook Window
myLayoutHook = (taskbarMargin $ twoTabbedPane ||| Grid) ||| Full
  where
    taskbarMargin = gaps [(D, 40)]
    twoTabbedPane = subTabbed $ TwoPane (1/55) (1/2)

比較

type MyLayoutHook = (TaskbarMargin :$ TwoTabbedPane :||| Grid) :||| Full
{--} myLayoutHook = (taskbarMargin  $ twoTabbedPane  ||| Grid)  ||| Full

Haskellの表現力はすごい 🐕

clock2017-07-04

GHCの-Wtype-defaultsを解決するにはちゃんと型付けするしかないかなあ

Test.hs

main :: IO ()
main = print 10

このコードを-Wtype-defaults付きでコンパイルすると、以下の警告が出る。 (-Wtype-defaultsはGHC-8.0.…

clock2017-07-01

MaybeTを使ってリファクタリングしたずら

 オラ、今日はLisp処理系の作成を進めてたずら。

clock2017-06-27

HakyllのCompilerでemoji(:dogs:)をコンパイルする

💠 🐕 💠 (💠 🐕 💠

🐶

 僕のこのブログのposts/*.mdは、以下のようにhtml…

clock2017-06-24

Haskellのtypeの中身はkind!で!(型レベルハンバーガーの型やいかに?)

 ここ4日間ぐらい、主にDataKindsTypeFamiliesを用いた型レベルハンバーガーの開発(型レベルプログラミング)を行っていた。

clock2017-06-12

【結論】Textの中のStringにmap :: String -> StringするにはProfunctorが一番!

 ときどきTextにpack,unpackを介してString -> String…

clock2017-04-12

haskell-stackでcan't load .so/.DLL for 〜/libncurses.soが出た場合の対処

対処

 ワークアラウンドを施します。

$ cd /usr/lib
$ sudo cp libncurses.so{,.bak}
$ sudo ln -s libncursesw.so.6.0 libncurses.so

参考

clock2017-02-11

Text(ByteString)をnewtypeした型でもOverloadedStringsできるよ。

GeneralizedNewtypeDeriving拡張を使う。

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}

import Data.String (IsString)
import Data.Text (Text)

newtype A = A Text deriving (IsString, Show)

a :: A
a = "ahoge"  -- 文字列リテラル of A

main :: IO ()
main = print a
clock2017-02-03

yiテキストエディタのインストール方法

 haskell-stackはインストールされているものとする 🐕

$ git clone https://github.com/yi-editor/yi yi
$ cd yi/yi
$ LANG=C stack setup
$ LANG=C stack build
$ LANG=C stack install

$LANGを外すと、cairoパッケージあたり? でGtk2Hs…

clock2017-01-31

Data.CharのisAlphaはマルチバイト文字を正しく扱えない

 isAlphaNumも同様。
まじ注意。

Prelude> import Data.Char
Prelude Data.Char> isAlpha 'あ'
True
Prelude Data.Char> isAlphaNum 'あ'
True

これを定義しておけばいいんだけど、他にどっかData…

clock2016-12-02

Yiが定義する型の紹介 - Haskell Advent Calendar 2016 - 4日目

 ドーモ、fix関数の簡約が「いい感じにやる」といった理解しかできないあいやです。
この記事は

clock2016-11-15

日本語環境のLANGでstack haddockができないやつの解決

 haskell-stackを使ってstack haddockを実行すると、Foo.hs: invalid byte sequenceみたいなエラーが出ることがある。

解決方法

clock2016-11-04

cmdargsはargsと同時にhelpを設定するとシぬ

clOptions :: CommandLineOptions
clOptions = CommandLineOptions
  { frontend    = "vty"   &= help "The frontend to use"
  , startOnLine = Nothing &= help "Open the (last) file on line NUM"
  , files       = []      &= help "FILES..." &= args  -- ここ
  }

デフォルトの引数をfilesで受けとりたくば、helpを消せ。
さもなくば我々をcmdargs…

clock2016-09-23

HaskellにはifMという関数がある

最近Haskellコードのcaseを多用するようになってたので、インデントレベルが…

clock2016-06-17

HackageにHaskellライブラリを上げてみた

HackageとHaskellライブラリを上げてみた

Hackageデビュー。

clock2016-06-04

ブログをFC2ブログからHakyll + github-pagesを使うようにした

ブログをFC2ブログからHakyll + github-pagesを使うようにした

 以前書いた 退職記事 がありましたが、あれはpandocでmarkdownからhtmlに変換してからFC…

clock2016-05-01

HaskellでTwitterにTweetする

HaskellでTwitterにTweetする

About

筆者プロフィール

my-latest-logo

aiya000(あいや)

せつラボ 〜圏論の基本〜」 「せつラボ2~雲と天使と関手圏~」 「矢澤にこ先輩といっしょに代数!」を書いています!

強い静的型付けとテストを用いて、バグを防ぐのが好き。Haskell・TypeScript。