タグ

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


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


    GHC  Call Arity調 Breitner (nomeata)  Call Arity  Haskell 1使 Haskell 
    Call Arity と融合変換
  • Haskellの関数に等価性を定義したい! - Qiita


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


    Goto import qualified Data.IntMapasMap 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(稿) GHCCore ()  GHCHaskellpass()  Compiling one module: HscMainGHC GHCCore CoreDesugar 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
  • ステートマシン猛レース - モナドとわたしとコモナド


    HaskellIO()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) 20161118  null()pythonnumpyndarray()shape()*1 ()
    問題を解決するつもりでキッチリ型を付けた先にある高い壁 - ぼくのぬまち 出張版