【サンプルpdfあり】技術書典7にて圏論入門小説を頒布します!【え20C】
概要
技術書典7にて、圏論入門小説を頒布します!(え20C)
- タイトル: せつラボ 〜圏論の基本〜
- ページ数:
128p158p!(第二版につき増量!) - …
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>>
…
Happyの%tokenではより一般的な形式を下にしなきゃだめ
正誤
正しい
%token
...
...
natType { (TokenAnIdent "Nat", _) }
boolType { (TokenAnIdent "Bool", _) }
ident { (TokenAnIdent $$, _) }
誤り
%token
...
ident { (TokenAnIdent $$, _) }
...
natType { (TokenAnIdent "Nat", _) }
boolType { (TokenAnIdent "Bool", _) }
これはhappy製の単純型付きラムダ計算パーサーの、トークン宣言部です。
…
ScopedTypeVariables下の1ランク多相で型が合わないとき
まとめ
forallを指定してあげると、一連のa
, b
が固定されてくれます。
f :: forall a b. Eq b => (a -> b) -> (a -> b) -> a -> Bool
解説
…
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…
数値をnewtypeした型の値として数値リテラルを使う
Num
型クラスに対してGeneralizedNewtypeDeriving
拡張を使うことができるので、
例えばInt
のnewtype…
ことり、穂乃果と一緒に学ぶHaskell(入門)その6「高階データ型」
Haskell(GHC)のimport/module構文に表れるのtypeキーワードについて(ExplicitNamespaces)
例によるGHC Haskellの中の概念の紹介記事。
GHCのHaskellでは(おそらく主に)DataKinds
拡張を用いる場合にて、以下のように
import
/module
構文内でtype
…
Haskell(GHC)のSymbol/Natカインドの型を値に落とす方法
Haskell(GHC)では以下のように、文字列を型として埋め込むことができます。
{-# LANGUAGE DataKinds #-}
type Str = "sugar"
main :: IO ()
main = return ()
こうすれば値"sugar" :: String
…
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
…
NonEmptyのIsListインスタンスの損なわせる型健全性
結論
OverloadedLists
でNonEmpty
を具体化しない方が良い。
概要
In haskell-jp slack
igrep [18:25]
OverloadedLists
, 意外と怖いですね。うっかりNonEmpty…
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…
なぜ(^.)にMonoidのPrismを指定できるのか
ネストした分岐を消す方法(タプルを使う)
まずはこのコードを見て欲しい。
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…
extensible-effectsの作用を拡大方向に変換する
作用とは
この記事ではEff
型の第一型引数を指します。
-- Fooは作用
Eff Foo a
拡大とは
この記事において、作用A
が作用B
…
typeでは型引数を省略しないと高階型クラスインスタンスにできない
class Foo (a :: * -> *)
のように、高階型に実装されることを要求する型クラスに対して
data Bar a = Bar Int a
type Baz a b = Either (Bar a) b
のようにすると
class Foo (Baz a)
…
Haskellのstack-build(test)の結果をGUI通知するsnowtify作ったよ
Haskell-jpのslackの#questionで 「stack testの結果をGUI…
にこ、希と一緒に学ぶHaskell(番外)「extensible-effectsの基本作用」 +絵里
せーのっ
希・絵里「にこ(っち)、ハッピーバースデー!♡」
🎉 パパーン!!
にこ「わ……」
…
見た目がひどい型を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の表現力はすごい 🐕
GHCの-Wtype-defaultsを解決するにはちゃんと型付けするしかないかなあ
Test.hs
main :: IO ()
main = print 10
このコードを-Wtype-defaults
付きでコンパイルすると、以下の警告が出る。
(-Wtype-defaults
はGHC-8.0.…
Haskellのtypeの中身はkind!で!(型レベルハンバーガーの型やいかに?)
ここ4日間ぐらい、主にDataKinds
とTypeFamilies
を用いた型レベルハンバーガーの開発(型レベルプログラミング)を行っていた。
【結論】Textの中のStringにmap :: String -> StringするにはProfunctorが一番!
起
ときどきTextにpack,unpackを介してString -> String…
にこ、希と一緒に学ぶHaskell(番外)「型クラスの定義と実装(Extra)」
ことり、穂乃果と一緒に学ぶHaskell(入門)その4「型クラスの定義と実装」
ことり、穂乃果と一緒に学ぶHaskell(入門)その3「代数的データ型の定義2」
ことり、穂乃果と一緒に学ぶHaskell(入門)その2「関数とデータ型」
ことり、穂乃果と一緒に学ぶHaskell(入門)その1「代数的データ型の定義」
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
参考
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
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…
Data.CharのisAlphaはマルチバイト文字を正しく扱えない
isAlphaNumも同様。
まじ注意。
Prelude> import Data.Char
Prelude Data.Char> isAlpha 'あ'
True
Prelude Data.Char> isAlphaNum 'あ'
True
これを定義しておけばいいんだけど、他にどっかData…
Yiが定義する型の紹介 - Haskell Advent Calendar 2016 - 4日目
ドーモ、fix関数の簡約が「いい感じにやる」といった理解しかできないあいやです。
この記事は…
日本語環境のLANGでstack haddockができないやつの解決
haskell-stackを使ってstack haddock
を実行すると、Foo.hs: invalid byte sequence
みたいなエラーが出ることがある。
解決方法
…
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…
ブログをFC2ブログからHakyll + github-pagesを使うようにした
ブログをFC2ブログからHakyll + github-pagesを使うようにした
以前書いた 退職記事 がありましたが、あれはpandocでmarkdownからhtmlに変換してからFC…