タグ

haskellに関するyharaのブックマーク (90)

  • 多相関数を第一級で取り扱う

    今回は,GHC拡張の一つ RankNTypes の紹介をしようと思う.もうちょっとちゃんとまとめたのをいつか Haskell-jp かどっかに投稿したいと思ってるんだが,時間が (さっさと書け). さて, Haskell のプログラミングにおいて多相関数はかなり重要な役割を持つ.しかしながら,標準の範囲では多相関数自体を第一級の値として扱うことはできない.私たちに許されるのは,多相関数を定義することだけだ.まあ,それだけでもかなり有用なんだけど,多相関数を第一級で扱えると,色々プログラミングの幅が広がる.今回は,多相関数を第一級として扱うというのはどういうことか,そしてそれをするにはどうすればいいか,そうすることで何がうれしいのかを簡単に触れられたらと思っている. 多相関数を第一級で扱うとはどういうことか (パラメトリック)多相関数 ((parametric) polymorphic fu

    多相関数を第一級で取り扱う
  • Lensだけで作るニューラルネットワーク

    これは、FOLIO Advent calendar 2021 の15日目の記事です。 圏論を機械学習に応用する話題の一つとしてLensで微分可能プログラミングを実装する話を紹介したいと思います。とはいえ圏論など気にせずLensを使ったニューラルネットワークを実装していきます。学習モデル、誤差関数、学習係数などの基的な構成要素が全てLens(ParaLens)として実装できる様子を楽しんでいただければと思っています。 Lensって何? Lensはいわゆる getter と setter を組み合わせたデータ構造です。すなわち型sのデータ型から型aの値を取り出すgetter s -> a と、型sのデータ型を型aの値で更新して新しい型sのデータ型を作成するsetter (s, a) -> s から成っています。

    Lensだけで作るニューラルネットワーク
  • 10年間使ってみて見えたHaskellの闇と光 - Qiita

    はじめに わたしがHaskellを使い始めてもうそろそろ10年目になります。(タイトルは多少サバを読んでいますね) これまで使ってきた感想をまとめます。 Haskellのつらいところ まずは愚痴らせてください。 コンパイルが遅い 依存モジュールはすべてソースコードからビルドする必要があります。(バイナリ形式のモジュールはありません) 最初のビルドに20分くらい待つのはザラです。 複雑な型システムをつかうと型推論や型レベル計算に時間がかかります。 高速なHaskellプログラムを書くためには多くの関数をインライン化する必要があります。最適化ビルドではインライン展開によってコードサイズが大きくなるので時間がかかります。 デバッグが難しい 公式のGHCiデバッガはありますが、今のところIDEから簡単に利用できるわけではないですし、コンパイル済みのライブラリはデバッグできないです。 近年スタックト

    10年間使ってみて見えたHaskellの闇と光 - Qiita
  • GHCの融合変換を理解する(前編) - Qiita

    module Sum where sum123 :: Int sum123 = sum [1,2,3] $ stack ghc -- -O Sum.hs $ stack ghc -- --show-iface Sum.hi (中略) 1eb3421a20d14a1255f6f5adccf8e3bd sum123 :: GHC.Types.Int {- HasNoCafRefs, Strictness: m, Unfolding: (GHC.Types.I# 6#) -} 今回の記事では、GHCはどのように6を計算しているのか解説します。ポイントはリストリテラルの脱糖と、fold/build変換です。 リストリテラル ghcに-ddump-dsオプションを渡すと脱糖の結果をみることができます。 -Oオプションがない場合、GHCは[1,2,3]を1 : 2: 3 : []に脱糖します。 $ s

    GHCの融合変換を理解する(前編) - Qiita
  • GADTによるHaskellの型付きDSLの構築 - プログラミングの実験場

    GADTについて、この解説が分かりやすい(英語)。 http://en.wikibooks.org/wiki/Haskell/GADT 背景 Haskell(というか関数型言語一般)の素晴らしい機能の一つ、代数的データ型を使うと、抽象構文木(AST)をHaskellの枠組みの中で表現できる。 例えば、整数の足し算・引き算ならば、 data Exp = Const Int | Add Exp Exp | Subtract Exp Exp さらにこのASTを数値一般に使いたいので型パラメータrをつけて多相にしてみる。 data Exp r = Const r | Add (Exp r) (Exp r) | Subtract (Exp r) (Exp r) これを使えば、例えば(3 + 4) - 2という数式は、Subtract (Add (Const 3) (Const 4)) (Const

    GADTによるHaskellの型付きDSLの構築 - プログラミングの実験場
  • 圏論入門前の準備運動―集合と写像― - Qiita

    想定読者と到達目標 Haskell 覚えつつ圏論も一緒に勉強しよう と思っていたけど結局は圏論に手も足も出ず、 Haskell はある程度できるようになった人へ1。 圏論とは何なのかを断片的にでも理解して、 自分が何をやってるのかを多少は把握しながら 圏論に入門できるようにするための準備運動。 目次 圏論入門前の準備運動―集合と写像― 写像とモノイドの概念を受け入れる 圏論が集合論の一般化であることを理解した気になる もう諦めない圏論入門―対象と射― もう諦めない圏論入門―圏と関手― もう諦めない圏論入門―関手と自然変換― もう諦めない圏論付録―ストリング・ダイアグラム― もう諦めない圏論基礎―極限からカン拡張へ― もう諦めない圏論基礎―モノイドからモナドへ― もう諦めない圏論基礎―高次元圏と変換手― 集合や写像とは何なのか、詳細に関しては 検索すれば幾らでも出てくるので省略する。 ここで

    圏論入門前の準備運動―集合と写像― - Qiita
  • 経験15年のOCaml ユーザーが Haskell を仕事で半年使ってみた - camlspotter’s blog

    今の会社に移って半年経ちました。めでたく試用期間終了です。といっても別に試用期間中に密かに首を切られるような事をしたとか、逆に試用期間が終わったからと言ってこれで定年までのうのうと働ける、という訳ではありません。未来は全く判りません。まあとにかく、一つ区切りがやってきました。 金融を知らないQuantsの仕事 私の職業の肩書きには Quantitatitatitatitative という単語がくっついて超カッコよさそう。普通は Quant というと、金融工学や統計数理に詳しい夜もブイブイいわしている超イケメン20代を想像しますが、私は金融とか全然知らないアラフォーお父さんです。それでも Quant です。お願いですから、私に何を買ったらいいかとか、聞かないでください。金融商品とか買った事ないし。というか、逆に教えて欲しいです。 私のチームは、当の Quant さん達が開発した、金融派生商

    経験15年のOCaml ユーザーが Haskell を仕事で半年使ってみた - camlspotter’s blog
  • 遅延評価でデバッグが困難になる状況

    先日、Haskell 界隈で遅延評価によってデバッグがし辛いのはどんな時かと言う話があった。見た感じ、遅延評価によってデバッグのしにくさはそんなに変わらないと言う意見が結構あり、個人的には衝撃だった。僕自身は遅延評価にだいぶヘイトを溜めてる人なので、どういう状況でデフォルト遅延評価が嫌かを実感できる問題を作った。この問題を解けば、きっとヘイトを共有できるはずってわけ。一緒に地獄に落ちような。 なお、かなり主観に寄っていて、結構書き殴ってる部分が多いので、厳密な議論をするにはあまり良い例ではないかもしれない。個人的には、備忘録的な意味合いも強くて、今まで詰まったやつをまとめておくかみたいな感じでもある。 先に結論を書いておくと、 プログラム自体が大きくて [1] 複雑な制御構造をしていて (optional) 以下のいずれかの条件を満たす 遅延評価を機能として使っている デバッグ対象が効率に

    遅延評価でデバッグが困難になる状況
  • haskell-shoen

    🎌ようこそ🎌 / kakkun61 / Haskell の歩き方 / リンク / パッケージティアリスト / Wiki のライセンス / ロゴ / チャット / Slack 管理者へのメモ / 文字コードを変換する / mrsekut / 論理学 / fumieval / barbies-th / Haskellのつらいところ / 組織紹介 / 避けるべきこと / HKD / Recursio

    haskell-shoen
  • Tart - なんと!ターミナル上で動作するドローアプリ MOONGIFT

    開発に関わる多くのことがCUIでできます。ただ開発するだけであればGUIは不要かも知れません。Webブラウザだけあれば十分という人は多いのではないでしょうか。 GUIでないとできなさそうな、ドローアプリケーションですらCUIでできます。それがTartです。 Tartの使い方 メイン画面です。 なんとマウスで描けます! フリーハンドだけでなく、四角などのドローも用意されています。 塗りつぶし。文字は自分で決められます。 キャンバスのサイズを拡張。レイヤーも用意されています。 さらにフォア、バックグラウンドの色を変更できます。 TartはCUIながら、一般的なドローアプリケーションの機能は実装されています。何よりマウスで操作できるのが気持ちいいです。できあがった作品はREADMEなどに埋め込んだりできるでしょう。 TartはHaskell製のオープンソース・ソフトウェア(BSD License

    Tart - なんと!ターミナル上で動作するドローアプリ MOONGIFT
  • Call Arity と融合変換

    GHC は,最適化のため Call Arity と呼ばれるコード解析を行っている.この解析で,自由変数が何個引数を持っていいかを判定し,イータ展開を可能にする.リストにおける融合変換とも密接な関係のある解析だ.こいつの存在とどういうことをやっているかはだいたい知っていたんだけど,ちょっと詳しく知りたい事例があったので調べてみた.そのメモ. なお元ネタは,Breitner (nomeata) 先生の Call Arity . イータ展開と最適化 Haskell は知っての通り関数型プログラミング言語なので,息を吐くように関数を第1級として使うし,標準ライブラリに無数の高階関数がある.関数は全てカリー化されていて,部分適用も可能だ.ただ困ったことに Haskell は実用されており,これらの関数型プログラミング言語で常用されているテクニックで書かれたプログラムで,通常のプログラミング言語程度と

    Call Arity と融合変換
  • Haskellの関数に等価性を定義したい! - Qiita

    きっかけ 一般的に関数の型をEqクラスのインスタンスにするのが実現不可能な理由は何か? どういった場合に実現可能か? 1年ぐらい前に、友人から上記の問いを出されて、その時に定義したものをまとめたいと思います。 関数の等価性の定義 おそらく、「同じ引数なら同じ戻り値を返す」関数同士は等価と言えるはずです。 そのため、関数の定義が異なっても等価なものもあります。 例えば、以下のように定義が異なってもpow2とpow2'は等価な関数のはずです。

    Haskellの関数に等価性を定義したい! - Qiita
  • Freeモナド実用の旅(3): TimeMachineモナド - モナドとわたしとコモナド

    前回のGotoモナドをさらに強化し、未来にも行けるようにしてみた。 import qualified Data.IntMap as Map import Control.Monad.Trans.Free import Control.Monad.Trans import Control.Monad newtype Ticket = TicketId {getTicketId :: Int} deriving (Eq, Ord, Show) data Train a = Ticket (Ticket -> a) | Departure Ticket a | Station Ticket a | Skip Ticket a a instance Functor Train where fmap f (Ticket g) = Ticket (f . g) fmap f (Departure t

    Freeモナド実用の旅(3): TimeMachineモナド - モナドとわたしとコモナド
  • GHCの中間言語Coreへの脱糖を覗き見る - Hash λ Bye

    Haskell (その3) Advent Calendar 2017 11日目の記事。(予約投稿知らなかったのでフライングになった) GHCがコンパイルの途中で中間表現として用いるCoreの生成っぷりを観察する。 観察して、あーはいはいなるほどね(わかってない)、と言うだけになりそう。 はじめに GHCはHaskellのソースコードを低レベルなコードへとコンパイルする過程で様々なpass(コンパイルのステージ)を通じてプログラムデータを変換する。 俯瞰図は下記のリンクに詳しい。 Compiling one module: HscMain 僕がGHCの話をどこかで聞きかじってかっこいいな、と思ったのは、 GHCがコンパイラの中間言語として定義しているCoreを知った時。 このCoreと名付けられた中間言語はDesugar passにて生成され、下記のような性質を持っている。 小さな構文 3つ

    GHCの中間言語Coreへの脱糖を覗き見る - Hash λ Bye
  • Parsecのソースちら見 - Qiita

    教科書的なパーサーと言えばStateT s []モナドをよく見るけど、今のParsecって全然そんな雰囲気ないんだなあ。 https://twitter.com/hiratara/status/297541496217927683 モナド体は継続モナド×4的な構造をしている。継続となる関数を4渡せば、結果を得ることができる。 newtype ParsecT s u m a = ParsecT {unParser :: forall b . State s u -> (a -> State s u -> ParseError -> m b) -- consumed ok -> (ParseError -> m b) -- consumed err -> (a -> State s u -> ParseError -> m b) -- empty ok -> (ParseError ->

    Parsecのソースちら見 - Qiita
  • ステートマシン猛レース - モナドとわたしとコモナド

    ストリーム処理ライブラリはHaskellにおいて競争の激しい分野の一つだ。ストリーム処理ライブラリとは大雑把に言うと、IOなどの作用を絡めながら値の列(ストリーム)を生成したり、処理したりする構造を提供するライブラリである。多くのライブラリは、以下の3種の構造を定義している。 生産者(プロデューサー): IOなどのアクションを伴いつつ値を生成する。 消費者(コンシューマー): 多くの場合モナド変換子になっており、await :: Consumer s m sのようなアクションを組み合わせ、値の列を処理するプログラムを書ける。 変換者(トランスデューサー): 入力を受け取りながら、出力もできる。 生産者と消費者が変換者の特殊な場合であるものも多い。 今回は、基中の基とも言える操作であるスキャンの速さを調べる。scan (+) 0は入力ストリーム[0,1,2,3, ...]を出力[0,1,

    ステートマシン猛レース - モナドとわたしとコモナド
    yhara
    yhara 2017/10/17
    “NonEmptyコモナドを使えば複数の世界線に分岐するようなストリームも表現できる” よくわからんけどつよそう
  • Dynamorphism 概論

    1. はじめに1.1. まえがき この記事では、関数型プログラミングにおいて動的計画法(Dynamic Programming)を行う手法の一つである dynamorphism について解説します。 しかし、dynamorphism という概念はそれ単体で説明できるものではなく、F-代数 や catamorphism, anamorphism, hylomorphism, histmorphism などの各種概念を用いないと説明できないものです。そこでこの記事では順々とそれらの概念を追っていき、最後にdynamorphismに行き着くような構成になっています。 そのため、この記事は dynamorphism の説明記事であると同時に、F-(余)代数や catamorphism, anamorphism 等に関する解説記事でもあります。 ここで留意していただきたい点が何点かあります。いわゆる

  • Dictionary Passing Style - mad日記

    desumasuさんがid:desumasu:20070913で触れられてるDictionary Passing Styleについて書いてみようと思います。 参考:栄光のグラスゴーHaskellコンパイルシステム利用の手引 以下のようなテスト用モジュールを実験の為に使用します。 module Test (show2 , show3) where show2 :: (Show a, Show b) => a -> b -> String show2 a b = show a ++ ", " ++ show b show3 :: (Show a) => a -> String show3 a = show2 a "hoge" Dictionary Passing Style Haskellでは多くの場合、多相型の具体的な型への解決は実行時に行われます。(もちろん静的に行われる場合もあります)

    Dictionary Passing Style - mad日記
    yhara
    yhara 2017/07/04
    “Dictionary Passing Style”
  • Indexed Monadの世界 - モナドとわたしとコモナド

    もっと、モナドの力を引き出したくはないか? え?アクションの前後で型を変えたい?いやいやいや、モナドは自己関手の圏上の単なるモノイドだよ、そんなことができ…る…!?えっ、できるの…マジで…? できる。そう、Haskellならね。 {-# LANGUAGE QuasiQuotes #-} import Control.Monad.Indexed.State import Control.Monad.Indexed import Language.Haskell.IndexedDo hoge :: IxState Int [Int] () hoge = [ido|do imodify (*10) imodify show imodify reverse imodify (++"123") imodify $ map fromEnum |] *ghci> runIxState hoge 42 (

    Indexed Monadの世界 - モナドとわたしとコモナド
  • 問題を解決するつもりでキッチリ型を付けた先にある高い壁 - ぼくのぬまち 出張版

    null安全おじさんになりかわりそれがしがお見せつかまつる 機械が理解できる複雑な契約の型表現がもたらすものは つまるところこのようなもの ずぶぶ(切った腹から証明オブジェクトを引き摺り出す)— Noriyuki OHKAWA (@notogawa) 2016年11月18日 過ぎたるは猶及ばざるがごとし. 最近null安全?だかの話のからみで,(静的な)型で契約云々を表現してシアワセになれるんだぜーと言うのをチラホラ見聞きする.たとえば,pythonで統計なり機械学習なりやっててnumpy弄るような人が,ndarray(多次元配列)のshape(多次元配列の形)が合わずエラーで落ちたりとかそういうアレについて云々という.なるほど型があれば実行前に止めることができ,実行時,エラー*1になってファーみたいなことは避けられるだろう. しかし,これが天国へ続く道かどうかはまた別の話.(依存)型で舗

    問題を解決するつもりでキッチリ型を付けた先にある高い壁 - ぼくのぬまち 出張版