タグ

関数型言語に関するnanakosoのブックマーク (716)

  • にせ末尾再帰 - あどけない話

    これはHaskellスペースリーク Advent Calendar 2015の8日目の記事です。 IOのコードは、普通に書けば末尾呼び出しの最適化が効く形になる。たとえば、こんな感じ: foo :: Char -> String -> IO Int foo a b = do c <- bar a b zoo b c woo c woo :: Int -> IO Int woo c = do d <- goo c return $ d + 1 foo が woo を呼び出す時は、fooのフレームを忘れてしまってよい。IOの文脈で再帰関数を書く場合も末尾再帰で十分な場合が多い。 goo :: Int -> IO () goo 0 = return () goo n = do getChar >>= putChar goo (n - 1) 残念なことに、一見末尾再帰に見えるが実はそうなっていなく

    にせ末尾再帰 - あどけない話
  • re:僕にとってMaybe / Nullable / Optional が、どうしてもしっくりこないわけ。 - ぐるぐる~

    元ネタ: 僕にとってMaybe / Nullable / Optional が、どうしてもしっくりこないわけ。 - 亀岡的プログラマ日記 OOPの文脈で見ると、元の記事が言っていることもわからなくはないのですが、対象が広すぎていろいろと不正確になってしまっているので、ちょっとまとめてみます。 元の記事が対象にしているのは、Maybe / Optional / Nullableの3つです。 対応する型を持つ言語を見てみると、下記のようになります。 Maybe(Haskell) Optional(Swift/Java) Nullable(C#) これらは、「値がないこと」を表すもの、という見方では同じですが、それぞれ異なる価値観の元に作られています。 Maybe/OptionalとNullable これらはすべて型パラメータを取ります*1。 しかし、この中でNullableだけは型パラメータに

    re:僕にとってMaybe / Nullable / Optional が、どうしてもしっくりこないわけ。 - ぐるぐる~
  • 関数プログラミング交流会で発表した - think and error

    ブログに書くという行為を忘れがちな昨今。 9/13に関数プログラミング交流会があったので発表してきました。 http://connpass.com/event/16193/ 並行プログラミングと継続モナド from Kousuke Ruichi 関数プログラミングという題目のため、参加者はかなり広いと思われました。そのためわかり易い話題とわかり易い遷移を心がけつつコアな人にも何か持って帰るものがあるといいなーと作成しました。まあしかし発表時間の短さ故にかなり早口で喋ったため、置いて行かれたように感じた方もいたようです... twitterで質問がありましたが、スタックオーバーフローとかネタとしてはもう少しあったのですが流石に詰まりすぎかなと断念。並行プログラミングネタをもっと前面に押し出さないと題名負けかなーと思ったけどこれも色々あって断念。並行プログラミング関係なく継続モナドが便利なだけ

    関数プログラミング交流会で発表した - think and error
  • Haskellでなぜストリーム処理ライブラリが必要なのか - fujimuradaisuke's blog

    関数型ストリーム処理勉強会で発表したので、ブログにも書いておきます。 元になった資料はこちら Haskellでストリームデータを扱う方法としては、Handleを使う方法、Lazy IOがありました。しかし、それぞれに問題があり、再利用性が高く堅牢なコードを書くことは困難でした。 この状況を解決すべく、Conduit、Pipes、io-streamsなどのストリーム処理ライブラリが現れたのですが、そもそもそれらが必要とされた経緯は具体的にはどのようなものだったのでしょうか? 元ネタ: http://okmij.org/ftp/Haskell/Iteratee/talk-FLOPS.pdf ソースコード: https://github.com/fujimura/functional-stream-processing-meetup-sample そもそもストリームとは 必要に応じて処理されるデ

    Haskellでなぜストリーム処理ライブラリが必要なのか - fujimuradaisuke's blog
  • Haskellで学ぶ圏論・ウォームアップ編 - 目次 - bitterharvest’s diary

    1.合コン 2.邪推 3.あみだくじ 4.小学生に戻って足し算 5.最大公約数の構造 6.最小公倍数の構造 7.仲間を求めて 8.二項演算子とカリー化 9.モノイドと二項演算子 10.カリー化と指数対象 11.集合間の写像 12.集合内の写像(Endomap) 13.グラフ 14.基点付集合 15.集合の圏のまとめ 16.積のまとめ 17.和(余積)のまとめ 18.写像のまとめ

    Haskellで学ぶ圏論・ウォームアップ編 - 目次 - bitterharvest’s diary
  • Frege: JVMのためのHaskellのような言語

    ドイツ数学者、Gottlob Frege氏から名付けられたFregeは、JVMのための純粋関数型の強力な型付き言語だ。FregeはHaskellと似ていて、「もっともHaskellらしいコードを修正せずに、または、見て分かる最小限の調整だけで動かせる。」 Fregeの開発者たちによると、Fregeは「パワー、単純さ、表現力の豊かさの組み合わせにおいて、類を見ないもの」である型システムをJVMに持ち込んだ。これにより、非正格 評価と型推論をサポートし、純粋性とデフォルトの不変性を可能にする。そのため、副作用は宣言された時のみ使うことができる。Fregeは、以下のようなHaskellの機能をほぼサポートしている。 ADTとパラメトリックポリモフィズムを用いた型クラス より高いランクの型 パターンマッチング リストの包含 do表記 ポイントフリースタイル モジュール functor、monoi

    Frege: JVMのためのHaskellのような言語
  • 「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのか - Qiita

    関数型プログラミングが流行していることもあって、頻繁に耳にする「参照透過性」という用語について考えます。 ∥ 参照透過性 - Wikipedia その過程で目にした、Stack Overflow 上の Reddy 氏の発言が面白かったので、ザックリと訳します。 用語の起源と、それがプログラミング言語に導入された経緯 一応意味は分かってはいるんですが、なぜ「副作用のない関数呼び出し」やら「変数への再代入の禁止」といった特性を「参照透過性」と呼称するのかが分かりませんでした。この場合の「参照」は、何が何を参照することであり、また、それがどういう状態にあることを「透過である」としているのかが、通り一遍調べてみても分かりませんでしたので、掘りに行ってきます。 英語Wikipedia の方には、この考え方がプログラミングの概念として導入された経緯についての論文が参考文献として挙げられています。

    「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのか - Qiita
  • Haskell環境構築_20151226_最新版_4_投稿済み_stack-1.0.0対応版.md - Qiita

    もうcabalを使う必要はないしcabal hellも無いんだ…… コンパイルしたバイナリも使い回せて世界は平和になるんだ…… 1. stackを入れる コンパイル済みバイナリをダウンロードしてパスを通す他に、 windowsにはインストーラ、macにはhomebrew、大抵のlinuxディストリビューション1にはリポジトリ等が用意されているので、以下を参考にお好きな方法でインストール Install/upgrade — stack documentation bash/zsh用に補完も用意されているので、好みに応じて Shell Auto-completion — stack documentation 2. ghcを入れる stackが最新のlts-haskellに対応したghcを入れてくれる。 $ stack setup Run from outside a project, usi

    Haskell環境構築_20151226_最新版_4_投稿済み_stack-1.0.0対応版.md - Qiita
  • モナドの実装いろいろ - Qiita

    モナドと一口に言っても内部実装色々あるので、同じ機能のモナドを色々な書き方で書いてみます。 要件 あまり複雑にしてもアレなので、State,WriterとIOの制約くらいにしておきます。 インスタンスはFunctor, Applicative, Monadのみ 内部にIntで0開始のカウンタと、DList Logで表現されるログを持つ incr :: Int -> DSL ()でカウンタを増減し、ログにI iを追加 reset :: DSL ()でカウンタを0に戻し、ログにRを追加 current :: DSL ()で標準出力に現在のカウントを出力。文脈内でそれ以外のIOは不可能とする runDSL :: DSL () -> IO (Int, [Log])でDSLを実行し、最後のカウンタの値とログを返す。 Logデータ型はこんな感じにして共通に使用し、

    モナドの実装いろいろ - Qiita
  • Stackでやる最速Haskell Hello world! (GHCのインストール付き!) - Qiita

    昨日第23回Haskellもくもく会 @ 朝日ネットで初めてstackを触ったのですが、 あまりにも簡単・高速にパッケージ作りの準備ができたので、やったことを共有したいと思います。 GHC(Haskellの最も有名なコンパイラ)のインストールまでやってくれるので、これからHaskell始めます!みたいな人にもオススメです。 stack自体が何かは @tanakh さんのHaskellのビルドツール"stack"の紹介をご覧ください。 一言で言うと「GHCのインストールからパッケージのインストールにビルドまで、ワンストップでやってくれる神ツール」ですかね。 各OSごとに微妙に違うみたいなので、公式ページの解説をご覧ください。 とはいえ、基的には実行ファイルをPATHのどこかに置くだけなので、この手の作業に慣れている人には朝飯前でしょう。 1ファイルだけでインストールできちゃうのも魅力ですね

    Stackでやる最速Haskell Hello world! (GHCのインストール付き!) - Qiita
  • Haskellで標準入力から読み込んだデータを処理して標準出力に出力する。 - Qiita

    main=interact$unlines.map.(f).lines f::String->String f s=変換処理 main=interact$unlines.map(show.(f)).lines f::String->Int f s=変換処理 main=interact$unlines.map(show.(f).read).lines f::Int->Int f n=変換処理 Register as a new user and use Qiita more conveniently You get articles that match your needsYou can efficiently read back useful informationYou can use dark themeWhat you can do with signing up

    Haskellで標準入力から読み込んだデータを処理して標準出力に出力する。 - Qiita
  • https://qiita.com/hiyakashi_/items/ca4f03b9620bb72ae5d5

  • Haskell開発環境の構築 (Linux編) - Qiita

    はじめに この記事では、以下二点を目標に話を進める。 Linux 上に最低限の Haskell 開発環境を構築する vim で ghc-mod による入力補完が使えるようにする 以下の点は扱わない。 cabal ファイルの書き方 stack の使い方 vim プラグインの導入/使い方 stack 導入 Haskell 環境構築のため、まずは stack を導入する。 stack は最近登場した Haskell のパッケージ管理/ビルドツール1で、色々便利なので入れておく。 How To Install の項を参考に stack をインストール https://github.com/commercialhaskell/stack 筆者の利用する Arch Linux では yaourt で導入可能。

    Haskell開発環境の構築 (Linux編) - Qiita
  • Haskellチートシート(翻訳) - Qiita

    http://cheatsheet.codeslower.com/CheatSheet.pdf の翻訳です。 日語訳版のファイルが無くなっているようなので。 誤字誤訳その他問題があればコメント、編集リクエストください。 また、直訳な部分も多いので良い訳がある場合もコメント、編集リクエストください。 Haskell Cheat Sheet このチートシートはHaskellの基的な要素である構文、キーワード、その他の要素を記しています。また、実行可能なHaskellファイル、印刷可能なドキュメントです。お好きなインタプリタでソースを読み込んでサンプルコードを動かしてください。 基構文 コメント 単一行コメントは--で始まり、行末までがコメントになります。複数行コメントは{-から-}までです。コメントはネストすることができます。 HaskellコードのドキュメントシステムであるHaddoc

    Haskellチートシート(翻訳) - Qiita
  • 何故、「そのプログラミング言語」で関数型プログラミングをするのが難しいのか - Line 1: Error: Invalid Blog('by Esehara' )

    近況 未来が脅す右手の指 ナイフが滑る左手首 朦朧と過ぎる日曜日 消えた秒針 数えた生久伸 このままでいいのか 俺はお前は 迷路の中 IT'S MY WORLD ――『KOKORO WARP』SHAKKAZOMBIE 問題 多くの人々にとって、既存の慣れ親しんだプログラミング言語で、最新のスタイルを身に着けたいと思うのが人の常だと思う。今宵、流行りのスタイルと言えば、恐らく「関数型プログラミング」になると思う。 混乱を避けるために、ここで一つ定義をする。ここで言う「関数型プログラミング」の定義とは、「副作用を出来るだけ避け、関数の連続によって書くプログラミング手法」という風にする。そして、このときの「関数」とは、「ある入力に対して、一定の出力を返すもの」という風に定義することが出来る。 さて、ここで二つの主題がある。まずひとつに、「副作用を出来るだけ避ける」という点と、「関数の連続によって

    何故、「そのプログラミング言語」で関数型プログラミングをするのが難しいのか - Line 1: Error: Invalid Blog('by Esehara' )
  • 関数型プログラミングの初心者の方、また勉強に躓いた方に質問します。…

    関数型プログラミングの初心者の方、また勉強に躓いた方に質問します。 現在、『マンガで学ぶ関数型プログラミング』という漫画の連載をしようと思っています。詳細は、下のブログを参考にしてください: http://bugrammer.hateblo.jp/entry/2015/07/12/155321 そこで関数型プログラミング初心者、あるいは挫折した方に質問します。どのような箇所で悩んだり、あるいは挫折しましたか? もしよろしければ、詳細なエピソードを教えてください。 また、「このトピックを重点的に解説して欲しい」と思うところがありましたら、それも教えてください(この項目に関しては必然ではありません) なお、学習していた/している言語には、特に制限はありません。

  • Stackを使って楽しくHaskellスクリプティング - Qiita

    今までいまいちモチベが上がらなかったHaskellでスクリプトを書くというのが、急に現実的になってしまったので、紹介します。 Haskellでスクリプティングする上での問題点 Haskellはもともと簡単なテキスト処理を書きやすいプログラミング言語ではあるのですが、標準で提供されているライブラリはあまり多くないので、必要に応じてコミュニティーパッケージを導入しなければその力を存分に発揮することができません。 通常のパッケージなら、cabalに依存関係を書けばパッケージマネージャで自動的に(コケることもありますが、理想的には)管理できるのですが、シェルスクリプトやPerl、あるいは最近ならPythonでやるような、コードを直接インタプリタで実行するような形のコードでは、そのような依存関係を自動で解決することは難しく、その上、仮にやろうとしたところで、いつまでもその依存パッケージが新しいコンパ

    Stackを使って楽しくHaskellスクリプティング - Qiita
  • プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー

    ScalaMatsuri2016でお話しさせて頂いた、あなたのScalaを爆速にする7つの方法の英語版です。 7つの角度でベンチマークを取っています。

    プログラミング言語のパラダイムシフトーScalaから見る関数型と並列性時代の幕開けー
  • Haskellのビルドツール"stack"の紹介 - Qiita

    Stackとは? つい先日のことですが、Stackage界隈からstackというツールがリリースされました。リリースされたとはいえ、開発され始めたのがちょっと前のことですし、現在も盛んに機能が追加されているので、絶賛開発中であるとかそういったほうがいいかもしれません。 まだ開発の始まったばかりのツールなのに、なぜこんな紹介記事を書こうと思ったのかというと、このツールがHaskellの開発において極めて有用になることが確定的に明らかであって、すでに荒削りながらも、大変便利に使えているからなのです。そしてここで紹介することで、多くの読者の方に興味を持ってもらって、それで開発がさらに盛り上がっていくと嬉しいなあと、そう思った次第であります。 なお、stackの開発が始まる少し前に、stackage-cliを始めとするいくつかのツールがリリースされましたが、今後開発はstackに一化されるような

    Haskellのビルドツール"stack"の紹介 - Qiita
  • 継続モナドによるリソース管理 - Qiita

    継続モナドって何に使うんだ問題に対する一つの例。 リソース管理の問題 プログラミングをやっていると必ずまとわり付いてくるのがリソース管理の問題です。ここで指すリソースというのは、ファイルのハンドルだとか、ソケットだとか、排他処理のためのロックだとか、グラフィックのハンドルだとかそういう話で、GCのない言語だとメモリの管理もこれに含まれるでしょうか。 言うまでもなく、リソースを確保した後はしかるべきタイミングで確実に解放してやる必要があります。しかし往々にして、現実のプログラムではリソースの解放漏れが発生してしまいます。単に解放するコードを書き忘れると言うのが一番単純でしょうもない理由ですが、それでも、C言語のようにリソース解放のための特別な仕組みを持たない言語では、これを徹底するのも結構骨の折れることだったりします。それはともかく、もう少し高尚な悩みとしては、例外との組み合わせで発生する解

    継続モナドによるリソース管理 - Qiita