タグ

haskellに関するnorisuke3のブックマーク (52)

  • 多価関数と Category - Qiita

    Control.Category モジュールを用いて多価函数1 の合成について考えてみます. 余力があればより有用な Control.Arrow モジュールについて見ていきたいです. GHC, GHCi を使う環境を想定しています. 次の記事 → 綱渡りと Category (と,Kleisli) 多価函数 多価函数とは 与えられた数 x に対して,その平方根を返す函数について考えてみます. 例えば 4 の平方根は 2 と -2, 9 の平方根は 3 と -3, 17 の平方根は √17 と -√17 のように平方根は (0 等を除いて) 二つ存在することがわかります. このように入力に対して複数の出力を持つ "函数" を多価函数と呼びます. 数学においては冪根,複素数の対数函数,周期函数の逆函数などさまざまな多価函数が存在します. 多価函数は函数ではない? 函数は一般的に "1 つの入力

    多価関数と Category - Qiita
  • n番煎じのrecursion-scheme

    前提になりそうなことをちょこっとPreliminariesに書いた. Recursion schemes 以下, C は適当な条件を満たすfunctor F: C -> C がFixをもち, さらにそれがCofixにもなっていることを仮定する1. 以下ではこの適当な条件を満たすfunctorしか考えないものとする. catamorphism F-algebra p: FA -> A に対し, D のinitialityにより得られる射 cata(p): D -> A を catamorphism とよぶ. これは in; cata(p) = fmap F cata(p); p: FD -> A を満たす. anamorphism catamorphismの双対. F-coalgebra q: A -> FA に対し, D のterminalityにより得られる射 ana(q): A ->

  • プログラマであるあなたが圏論を学んで得られる事、得られない事 - Creatable a => a -> IO b

    「Haskellと数学とちょびっと音楽」なんていうシャレオツなサブタイをブログに付けてるのは誰ですか? 俺だよー! 大体、Haskell関連のコミュニティに顔を出していると、 数学科出ましたーとか、物理専攻ですー、とか、そーいう人がわりと多いのですが、 僕は「勉強なんて出来ないんジャー・レッド」だったので、サブタイトルに「数学」なんて入れつつも、 数学の話はほとんど出来なかったりとか出来たりとか・・・結局Haskellの記事しか書いてないですね、はい。 ただ、どちらかというと、Haskellでも処理系どうのとか、パフォーマンス云々とか、 そういう話より型システムでどうやって抽象化するかーみたいな、そういう話のほうがおもしれーとか思ったりしたので、 気づいたら圏論なんかはガジガジしてまして、多少の自己流の知識があったりとかなかったりとかしてるのです。 純粋関数型やらHaskellやらがメジャ

    プログラマであるあなたが圏論を学んで得られる事、得られない事 - Creatable a => a -> IO b
  • Arrow を理解する (まとめ) - Qiita

    頭が悪くてずっと理解できなかった Haskell の Arrow をこのたびやっと理解し始めたので,その過程をまとめました. Arrow について勉強したい人の理解の一助になればと思います. 多価関数と Category 綱渡りと Category (と,Kleisli) (>>=) を (>=>) に書き換える Category から Arrow へ (未完) 間違いの指摘,疑問やツッコミなどあればコメントでお願いします.

    Arrow を理解する (まとめ) - Qiita
  • JavaScriptユーザのための関数型プログラミング(後編) | POSTD

    この記事の前編はこちら: JavaScriptユーザのための関数型プログラミング(前編) 遅延評価 遅延評価 は、 サンク や ジェネレータ などのもっと具体的な概念をカバーする一般的な用語の一種です。遅延評価は、その言葉が表すとおりのことを行います。つまり、値が必要になるまで評価しません。可能な限りずるずると、先延ばしにします。例えば、洗わなければならない器が大量に、もしかすると無限にあるとします。器を全て流しに置いて一度に洗うのではなく、ゆっくり、一度に1つずつ取って洗うのに似ています。 遅延評価の質を少しでも理解しやすくするために、Haskellを使って説明したいと思います。まず、 プログラムがどのように評価を行うか を理解する必要があります。皆さんが慣れているほとんど全ての言語は、 最内簡約 を用いています。最内簡約とは、次のようなものです。

    JavaScriptユーザのための関数型プログラミング(後編) | POSTD
  • JavaScriptユーザのための関数型プログラミング(前編) | POSTD

    私が関数型プログラミングについて度々耳にするようになったのは、数カ月前からです。でも当時は、それが何なのか見当もつかず、単なるバズワードだと思っていました。皆さんの中にも、そのような方は多いでしょう。それ以来、私は関数型プログラミングについて深く学び、この言葉を日々聞いてはいるものの内容を理解していない初心者の方のために、分かりやすく説明しようと思い立ちました。 関数型プログラミング言語の話になると、「 Haskell と Lisp は どちらが優れているのか 」という 議論 が 白熱する 傾向にあります。HaskellとLispはどちらも関数型言語ですが、実際には大きな違いがあって、それぞれに長所と短所があります。その具体的な内容については、この記事を読み終える頃には深く理解していただけると思います。この2つの言語には、それぞれから派生した言語があります。その中で恐らく皆さんが耳にしたこ

    JavaScriptユーザのための関数型プログラミング(前編) | POSTD
  • なぜ関数プログラミングは重要か

    John Hughes, Institutionen för Datavetenskap, Chalmers Tekniska Högskola, 41296 Göteborg, SWEDEN. rjmh@cs.chalmers.se この日語訳は原著者の承諾を得て山下がここに公開するものです。 この訳文についての、御指摘などは山下伸夫(nobsun .at. sampou.org)までおねがい いたします。 翻訳最終更新日 : 2011-09-17 原文 "Why Functional Programming Matters" 日語訳PostScript この論文は1984年以来何年ものあいだChalmers大学のメモとして回覧された。 1989年と1990年に幾分か改訂をしたのが[Hug89]と [Hug90]である。この版はもとのChalmer大学のメモ のnroff原稿をもとに

  • 「関数型プログラミング言語の定義&実装の仕方の例」をHaskellで実装してみた - Qiita

    module Evaluator where import AbstractSyntax -- | -- 評価器 -- -- プログラム例1:たしざん -- >>> let one_plus_two = Sub (Int 1) (Sub (Int 0) (Int 2)) -- >>> eval one_plus_two -- Int 3 -- -- プログラム例2:関数定義・適用と条件分岐の例 -- >>> let _Let x e1 e2 = App (Fun x e2) e1 -- >>> let _Abs = _Let "abs" (Fun "x" (If (Var "x") (Int 0) (Sub (Int 0) (Var "x")) (Var "x"))) (App (Var "abs") (Int (-42))) -- >>> eval _Abs -- Int 42 -- -

    「関数型プログラミング言語の定義&実装の仕方の例」をHaskellで実装してみた - Qiita
  • 【Haskell】Parsecで構文解析して構文木を作る

    Haskellで構文解析する方法として、Parsecを使って簡単な文法を解析できるパーサを作ってみる。構文木の構築だけで、構築した木の評価はここではしない。 1. 簡単な計算機を作るまずは整数の四則演算ができるだけの、簡単な計算機を作ってみる。 buildExpressionParser を使うと演算子に優先順序のある中置記法の式をパースするパーサを簡単に作れる: -- Parser1.hs import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Expr import Text.ParserCombinators.Parsec.Language import qualified Text.ParserCombinators.Parsec.Token as P lexer :: P.TokenPar

  • Haskellの入門から中級者になるまでの指針 - Qiita

    プログラミング言語の学習は一般に大変である。 最初にどのようなことをすればいいのか、どのをよむべきなのか等疑問は尽きない。マイナーな言語で情報が少なければなおさらである。 この記事では諸事情でHaskellに入門することになった方にむけて、どのように勉強していくか、参考にすべきや記事を紹介する。 より良い指針にするためにも、指摘、感想等はコメントや私のTwitterアカウント(@Lugendre)に投稿して頂けるとありがたい。 入門〜初心者 環境構築 まずどんなプログラミング言語においても、プログラミングをする環境が必要である。Haskellにおいては Stackと呼ばれるツールをインストールすることによって、コンパイラ(GHC)、モジュールのインストール、ビルドなど自動でやってくれるようになるので、とりあえず脳死でStackをインストールしておけば良い。 以下の@igrepさんの記事

    Haskellの入門から中級者になるまでの指針 - Qiita
  • 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
  • 2.5. GHCiデバッガ

    GHCiは単純な命令的スタイルのデバッガを搭載していて、実行中の計算を停めて変数の値を確かめることができる。このデバッガはGHCiに統合されており、デフォルトで有効になっている。デバッグ機能を使うのにフラグは必要ない。一つ、重要な制限があって、ブレークポイントとステップ実行は解釈実行されているモジュールでしか使えない。コンパイル済みコードはデバッガからは見えない[5]。 このデバッガは以下のものを提供する。 プログラム中の関数定義や式にブレークポイントを設定する能力。その関数が呼ばれたとき、あるいはその式が評価されたとき、GHCiは実行を中断してプロンプトに戻る。そこで、実行を続ける前に、局所変数の値を調べることができる。 ステップ実行ができる。評価器は、簡約をだいたい一回行うごとに実行を一時停止し、局所変数を調べることができるようにする。これはプログラムのあらゆる地点にブレークポイントを

  • Haskellの最近の例外ハンドリング - syocy’s diary

    どうもHaskellには標準のControl.Exceptionモジュールだけでなくmtlやexceptionsやexceptionalといった例外を扱うためのパッケージがあるらしいのだが、そのあたりのパッケージの選び方や使い方についてまとまった情報を見つけられなかった。 HaskellWiki例外のページも少々古いようで、deprecatedなものや統合される前のパッケージを書いていたりする。 調べた限り、mtlとexceptionsが今の主流っぽい。 その2つの使い方をまとめる。 なおバージョンはlts-6.1を基準としている。 mtl mtlパッケージのControl.Monad.ExceptモジュールはMonadErrorというモナドとExceptTというモナド変換子を提供する。 以下のように使う。 import Control.Monad.Trans(lift) import C

    Haskellの最近の例外ハンドリング - syocy’s diary
    norisuke3
    norisuke3 2018/01/16
    例外処理
  • 第1回 関数型プログラミングの世界へようこそ - 本物のプログラマはHaskellを使う:ITpro

    Haskellというプログラミング言語を知っていますか? 全く聞いたことがないという人が多いかもしれません。そういう名前の言語があるのは知っているけど,どんな言語かは知らないという人もいるかもしれませんね。でも最近では,一部の先進的なソフトウエア開発者の間で,一種のブームと言えるほど熱狂的に受け入れられています。 なぜならば,Haskellは様々な優れた特徴を持っているからです。最初に,他の言語にはあまり見られない際だった特長を一つだけ紹介してみましょう。「遅延評価(lazy evaluation,怠惰評価ともいう)」です。 遅延評価とは,与えられた値を必要になるまで評価(計算)しないということです。この性質により,不必要な計算が行われる無駄をなくすことができます。また,「潜在的に無限の大きさを持つデータ構造」といった通常のプログラミング言語では扱いの難しいものを直接扱えるため,より直接的

    第1回 関数型プログラミングの世界へようこそ - 本物のプログラマはHaskellを使う:ITpro
  • モナドトランスフォーマーとその周辺 - Qiita

    モナドに関する記事は世の中に沢山ありますが、モナドトランスフォーマーに関する記事はあまりないように思います。その概念が意味する所はHaskell初心者はもちろんのこと、他の言語使用者も知っておいて損は無いと思います。 モナドトランスフォーマーとは、「モナド変換子」とも言いますが、モナドと組み合わせる事で、新しいモナドを生み出すことが出来るデータ構造の事です。 例えばモナドIO1とトランスフォーマーStateT sを組み合わせると、StateT s IOというモナドになります。組み合わせた結果がモナドなので、これもさらに他のトランスフォーマーと組み合わせる事も出来ます。そこでReaderT rを組み合わせてみます。すると、ReaderT r (StateT s IO)というモナドになります。さらにEitherT eを組み合わせると、EitherT e (ReaderT r (StateT s

    モナドトランスフォーマーとその周辺 - Qiita
  • 『プログラミング Haskell』『すごい Haskell 楽しく学ぼう!』の次に何を読む?

    邦書の二大 Haskell 学習書を読み終えたら次は何を読めば良いのか? に対する偉大な先達のご意見。 途中から流れが Haskell の doctest の話題になっています。

    『プログラミング Haskell』『すごい Haskell 楽しく学ぼう!』の次に何を読む?
  • Real World Haskell の古いところ - あどけない話

    Real World Haskell の内容が古くなってきたので、どこが古いかとか、それに変わる新しいものは何とか、まとめたいと思う。 Real World Haskell―実戦で学ぶ関数型言語プログラミング 作者: Bryan O'Sullivan,John Goerzen,Don Stewart,山下伸夫,伊東勝利,株式会社タイムインターメディア出版社/メーカー: オライリージャパン発売日: 2009/10/26メディア: 大型購入: 8人 クリック: 245回この商品を含むブログ (76件) を見る 1章 始めましょう 今でも通用する。 2章 型と関数 今でも通用する。 3章 型を定義し、関数を単純化する 今でも通用する。 4章 関数プログラミング ghc に --make オプションはもう不要。 5章 ライブラリを書く 5.14節では、"runghc Setup build" の

    Real World Haskell の古いところ - あどけない話
  • Haskell-jp wiki - Front Page

    ようこそHaskell-jp wikiへ! このサイトについて(現在は編集できない状態で公開しています!) このWikiはHaskell関連情報を日語でまとめるためのポータルサイトです。 2022年11月までgititというWikiエンジン(もちろんHaskell製)で運用されておりましたが、ホスティングサービスとして利用していたHerokuの無料プランが廃止されたことや、長期間編集される見込みがないことから、現在は静的サイトとして読み込み専用で公開しています。編集用のページや編集履歴にアクセスしても404 Not Foundが返ってきます。そのほか、多くのページはURLが変わってしまっている点にご注意ください。編集履歴を閲覧したい場合はGitリポジトリーにおける履歴からご覧ください。編集したい場合は今後はhaskell-shoenの利用をご検討ください。 コンテンツ メーリングリスト

  • xmonadとHaskell(その8:関数の面白性質)

    前回書いた、謎のカリーおじさんのイラストの話。 謎でもなんでもなくて、ハスケル・ブルック・カリーさんらしい。。。。 さて、題のHaskellの関数の話。 括弧がなさ過ぎてよくわからない? C言語なんかだと、関数の引数は括弧で囲まれている。 hogefunction (arg1,arg2) みたいな感じ。 しかし、Haskellにはそういう括弧はないので、初めて接する時にどれが引数なのかわからなかったり、そもそも関数がどれかもわからなかったりするかもしれない。上のコードはHaskell的には hogefunction arg1 arg2 みたいな感じになるが、この名前を単純にして a b c と書かれると、なんだかわからなくなるかもしれない。 名前が単純でもC言語的に書けば a(b,c) で、なんとなくわかる。 このわからなさを解決するアバウトな目線としては、単語が並んでいたら先頭が関数、

    xmonadとHaskell(その8:関数の面白性質)
  • xmonadとHaskell(その9:演算子とか結合規則とか)

    xmonadのある風景 デスクトップPCの広い画面だと、タイリングの便利さが実感できる。 さて、(その8)で関数の部分適用の話をして、dzenPPの項目の一つ ppCurrent = dzenColor "#00ffaa" "" . wrap "[" "]" の部分のdzenColorやwrap関数の部分が部分適用された新しい関数ということを把握した。 ちなみにdzenColor関数の引数は、一つ目がフォアグラウンドの色、二つ目がバックグラウンドの色、3つ目が中身の文字列となっている。 dzen上での表示は通常テキストで行うが、一定のコマンド文字列を含ませることで、テキストに色を付けたりできる。このdzenColor関数は、そのコマンド文字列を簡単に生成してくれる。 https://github.com/robm/dzen READMEの「(5) In-text formating & c

    xmonadとHaskell(その9:演算子とか結合規則とか)
    norisuke3
    norisuke3 2017/12/05
    putStrLn . show $ 1 に $ が必要な理由 -> 関数はどんな演算子よりも優先順位が高いから。$ が無いと putStrLn . (show 1) となりputStrLn の引数の型が一致しなくなる。