タグ

haskellに関するl-_-llのブックマーク (50)

  • 本物のプログラマはHaskellを使う

    日経クロステック Special What's New ベネッセホールディングスが標準機として選んだレッツノート 専門家が斬る日の意識と対策の現状は? 神田れいみと学ぶ「ネットワーク活用白書」 ゼロトラスト成功の秘訣を神田れいみと探る 地域創生で重要になる「事業化」の視点とは 3つのペルソナで、働き方に合わせたPC選び ERPプロジェクトIT人財の必須条件は 経営 地域創生で重要になる「事業化」の視点とは ERPプロジェクトIT人財の必須条件は 先進都市対談>生成AIは行政DXの切札? 多様化する地域の課題解決に向けて議論 地域×テクノロジーでミライを共創する 脱レガシー案件≫SIerに必要な人財像は 役所文化の変革!奈良市のデジタル市役所 3段階で考える、DXで企業力を高める方法 イノベーションの起爆剤 石戸氏に聞く。生成AI教育で使うには 東芝が描くDXの道筋とその先の未来とは

    本物のプログラマはHaskellを使う
  • 本物のプログラマはHaskellを使う

    第58回 Cの配列をHaskellで利用する Haskellでは、リストや配列といったデータ構造に対する処理を高速化するために様々な試みが行われています。しかし、残念ながら現在のHaskell処理系やライブラリの実装には性能面でまだまだ課題があります。Cの配列をHaskellで直接利用するようにすれば、性能の向上を期待できます。Cで書かれたO… 2013.08.07 第57回 機能テストや性能テストをCabalで自動化 前回は、ライブラリや実行可能ファイルを提供するパッケージをCabalで作る方法を説明しました。Cabalには、パッケージをテストするための機能も用意されています。今回はこの機能の使い方を説明します。 2012.12.06 第56回 Cabalを使ってパッケージを作成する これまでの回では、Cabalを使って作成したHaskellのパッケージをたびたび利用してきました。しかし

    本物のプログラマはHaskellを使う
  • 内包表記について、すごい合同勉強会で話した | そんなこと覚えてない

    すごい合同勉強会2014 in 広島でセッションしたので内容を公開しておく。 今回は「私がモナドの内包表記という名前を知った時の感覚を伝えよう」というのが目的でした。 さりげなく「私がモナドに感じている効能を伝える」というのもしているのですが、そこは当にさりげなく。 内包表記。その意味を知らずに5年前ぐらいにpythonで利用していて、forやif文字通りにうけとっており、その動作を正しく理解できてないときがありました。 現在とその間にHaskellを学び、その5年前の自分に内包表記を伝えるにはという観点で話を進めました。 まず、リストの内包表記ですが、リストを生成を簡単にしてくれる機能です。 内包表記は、どうやら数学の集合の記法である内包的記法に由来するそうで、「関数プログラミング入門 ―Haskellで学ぶ原理と技法―」か何かで読んだ記憶があります。 その対になる記法として外延的記法

  • リストは非決定性のモナド - あどけない話

    Haskell のリストはモナドであり、それは非決定性の文脈を表すと言われます。しかし、そのことを扱った例題は少なくて、しかもイマイチでした。そこで、Scheme で書かれたよい例題を Haskell で書き直してみました。 「On Lisp」の「非決定性」の章では、謎めいた関数 choose と fail が出てきます。こんな難しい話をしなくても、Haskell では単に全探索することで非決定性を実現できます。なぜなら、Haskell の評価戦略は遅延評価なので、答えの先頭しか要求しなければ、残りの答えは探さないからです。 というわけで、Haskell で非決定性の問題を解くことは、リストを使って普通にプログラミングすることとなんら変わりません。 三平方の定理 「もうひとつの Scheme 入門」に載っている三平方の定理に関する問題を解いてみましょう。 x = [1,2,3,4,5],

    リストは非決定性のモナド - あどけない話
    l-_-ll
    l-_-ll 2023/05/07
    "Haskell では単に全探索することで非決定性を実現できます。なぜなら、Haskell の評価戦略は遅延評価なので、答えの先頭しか要求しなければ、残りの答えは探さないからです。"
  • Haskellの神話 - あどけない話

    Haskell の優雅さを示すためによく使われるコードは、優雅さと分かりやすさだけに特化しており、現実的には遅いことが多い。書き手は他に効率のよい実装があることを知っているのだけれど、読み手はそうではないから、後で効率が悪いと気づいて愕然とするみたいだ。 この記事では、神話になっている例を3つ取り上げ、効率のよい実装と合わせて紹介する。その 3 つの例とは、以下の通り。 フィボナッチ数 素数生成 ソート フィボナッチ数 遅延評価を活かした優雅なフィボナッチ数の実装は、以下の通り。 fib n = fibs !! n fibs = 0 : 1 : zipWith (+) fibs (tail fibs) Haskellの「fib = 1:1:zipWith (+) fib (tail fib)」はとても遅いにも書かれているように、この実装は遅い。 その理由は、(+) の計算が遅延し、その待機

    Haskellの神話 - あどけない話
  • (続)Haskell(GHC)での軽量ユーザスレッドの実装方法 - あどけない話

    Haskell(GHC)での軽量ユーザスレッドの実装方法で、Cmm が軽量スレッドのポイントと書きました。しかし、GHC の実装者 Simon Marlow 先生から「Cmm は関係ないよ」と教えて頂きました。 StgCall StgCall がいくつかのレジスタを保存するのは、採用しているCの関数呼び出し規約がそうなっているから。スレッドとはまったく無関係。 GHC のランタイムは C で書かれている。よって、スケジューラからスレッドを呼び出すと、C から Haskell を呼び出すことになる。C では、呼び出された関数がレジスタを保存しなければならない。Haskell の関数には、こういった制約はない。なので、C から Haskell の関数を呼び出す際は、C の規約を肩代わりしてやる必要がある。それが StgCall。 スタック Haskell のスタックは C のスタックと同様、特

    (続)Haskell(GHC)での軽量ユーザスレッドの実装方法 - あどけない話
    l-_-ll
    l-_-ll 2023/03/29
    "Haskell では、外部言語の関数呼び出し専用のカーネルスレッドを用意していて、ユーザスレッドがブロックされないようになっている。"
  • カリー化談義 - あどけない話

    最近、スタートHaskellで「カリー化された関数のメリットは何か?」という質問が出た。そのすぐ後に、kmizuさんがカリー化の誤用に対して警鐘を鳴らしてしていた。僕からするとkmizuさんの「カリー化の定義」も誤用に思えたので、調べるとともに考えたことのまとめ。 いろんな定義 「カリー化する」という用語は、すくなくとも以下の3つの意味で使われているようだ。 部分適用という意味 これは明らかに間違い 「複数の引数を取る関数」を「一引数を取る関数のチェインに直す」こと これはkmizuさんの定義。世間でもよく使われる。 「構造体を一つ取る関数」を「構造体のメンバーを複数の引数にばらし、一引数を取る関数のチェインに直す」こと これは僕の定義。というか、Haskellコミュニティの定義。 「部分適用」の意味で使うのは明らかに間違いのなで排除。定義2と3について議論する。あとで、部分適用とは何かに

    カリー化談義 - あどけない話
    l-_-ll
    l-_-ll 2023/03/29
    "関数が元々一つしか引数をとらないような Haskell では、タプルを取る関数を、そのタプルの中身の要素を引数とする関数のチェインに変換することを指す"
  • 状態モナド遊び - あどけない話

    状態をモナドで実現する方法を考えます。 リスト 例は簡単な方がいいので、データ構造として Lisp 風のリストを定義しましょう。 data List a = Nil | Cons a (List a) deriving Show リストは、こんな風に表せます。 Cons "c" (Cons "b" (Cons "a" Nil)) Lisp 風の cons も定義してみましょう。 cons :: a -> List a -> List a cons x xs = Cons x xs cons "c" $ cons "b" $ cons "a" Nil → Cons "c" (Cons "b" (Cons "a" Nil)) 状態を持つリスト さて、この Lisp 風のリストに、要素の数を覚えさせておきたいとしましょう。もちろん、数えれば分りますが、数えなくても一瞬で分るようにしたいのです。

    状態モナド遊び - あどけない話
  • Haskell ポインタープログラミング - あどけない話

    早いもので、今年も12月25日となりました。メリークリスマス! うちのちびっ子怪獣たちも、サンタさんに書いた手紙通り、レゴをもらってご満悦のようです。 そして今日は、Haskell Advent Calendar 2013 の最終日でもあります。 Haskellらしい? 「純粋なコードで構成するのが Haskell らしいプログラムであり、IOはHaskellらしくない」という発言をよく耳にします。 確かに、命令プログラミングの世界から関数プログラミングの世界にやってきたとしたら、 不変データを使った永続データプログラミング 部品プログラミング 純粋なコードに対する性質テスト などには、衝撃を受けることでしょう。 でも、純粋なコードは、Haskell の世界の半分でしかありません。そこは、コンパイラーという保護者に守られた未成年の世界です。Simon Peyton Jones さんの言葉を

    Haskell ポインタープログラミング - あどけない話
    l-_-ll
    l-_-ll 2023/03/28
    "この記事では、Haskellを型安全なCとして使い、メモリーを操作する方法について説明します。"
  • 関数型言語での関数の基礎知識 - あどけない話

    関数型言語での関数について、Haskell を用いて説明します。 関数の型 関数の型は、-> を使って書きます。例えば、Int を Char に変換する chr という関数の型は、以下のようになります。 chr :: Int -> Char 一引数の関数の型は、まぁこんなもんだと思えるでしょう。びっくりするのは、引数が増えたときです。たとえば、replicate という関数の型を見てみましょう。 replicate :: Int -> a -> [a] replicate は、第二引数で指定されたデータを第ー引数に指定された個数分用意して、リストにして返す関数です。([] は配列ではなく、リストです。) 次のように動きます。 > replicate 3 "foo" → ["foo","foo","foo"] a は型変数といって、任意の型を取れます。なじめない人は、具体的な型を当てはめてみ

    関数型言語での関数の基礎知識 - あどけない話
  • Haskellの文法(分岐編) - あどけない話

    僕が Haskell を学び始めた頃、Haskell の文法はすんなりとは頭に入ってきませんでした。もともと僕はプログラミング言語の学習能力が低いので、僕だけかもしれませんが、「はじめからこう言ってもらえれば分かったのにぃ」ということを書きます。 はじめの一歩 分岐は case で書きます。以下に Maybe a に対する例を書きます。 case mx of Just x -> ... Nothing -> ... 念のため、Maybe a の定義も見てみましょう。 data Maybe a = Nothing | Just a 列挙されているデータ構成子を case に列挙できることが分かるでしょう。このように、case でマッチできるのは、データ構成子で表現されたパターンになります。 ワイルドカード たとえば、以下のような型を定義したとします。 data Foo = A | B | C

    Haskellの文法(分岐編) - あどけない話
  • Haskell から見た node.js - あどけない話

    誤訳 以前、「サーバサイドJavaScriptのNode.js、最初はCやHaskellを検討し失敗。開発者ライアン・ダール氏へのインタビュー」という記事が twitter で話題になっていました。 ―― なぜJavaScriptを選んだのでしょう? ダール氏 実は最初は違いました。最初はC、Lua、Haskellなどで失敗していました。そんなときV8(Chromeが採用しているJavaScriptエンジン)に気がついて、やろうとしていることに対してJavaScriptが完璧な言語だと突然ひらめいたのです。 ただでさえ、Haskell は遅いと誤解されているのに、このような悪意さえ感じらえる訳だと、さらに誤解が深まりそうです。原文にはこう書かれています。 Dahl: Originally I didn’t. I had several failed private projects doi

    Haskell から見た node.js - あどけない話
    l-_-ll
    l-_-ll 2023/03/28
    "僕の経験では、ネットワークのコードを Haskell で書くと C と同等かそれ以上の速度が出ます" "Haskell のユーザスレッドのオーバヘッドは15ワード+スタック+αです。入出力を起こさないなら10万個生成しても問題ありません"
  • Haskellの講義に関するQ&A - あどけない話

    岡山大学で、関数プログラミングの講義を一コマ担当しました。資料は、函数プログラミングの集いで使った関数プログラミングの道しるべを流用しました。ちゃんと用意しなくて、講義を受けた学生には申し訳ないです。 講義内容に関して質問を頂きました。同じような疑問を持つ人も多いと思いますので、担当教官の許可を得てここに公開します。 永続データプログラミングの意義は分かったが,破壊しないと効率が悪いのではないですか.配列のような構造が世の中には多い気がします.メモリは足りなくなりませんか. 基的に永続と呼ばれているデータは、共有の効率が高く、しかも不要になった部分はすぐに GC に回収されます。また、GHC の GC はすごく優秀であることが知られています。 Haskell では、下位のレイヤーではデータを破壊できて、たとえば固定長のバッファーを使い回すといったことも可能です。ただ、それは普通のプログラ

    Haskellの講義に関するQ&A - あどけない話
  • 「Haskellのモナド完全に理解した」試験問題

    Haskellは勉強したけどモナドを当に理解したって言えるのか自信がない… \そんな人向けの試験問題を作りました!/ これから実施する試験問題を、10問中8問正解すればあなたはHaskellのモナドを完全に理解しています。私が保証します! それではさっそく〜〜 第一問 まずは緊張をほぐしましょう。 Haskellの Monad は○○○○である ○○○○に当てはまるのは以下の選択肢のうちどれでしょう? 型 関数 型クラス 型シノニム 答え

    「Haskellのモナド完全に理解した」試験問題
  • Haskell で、優先度付きキューを使ったダイクストラ法

    Haskellのカレンダー | Advent Calendar 2022 - Qiita に参加させていただきます! 突然ですが Haskell でダイクストラ法を実装します。 ダイクストラ法は重み付きグラフで最短経路問題を解くアルゴリズムのひとつです。ダイクストラ法 - Wikipedia に詳しい解説があります。 ダイクストラ法は、重み付きグラフにおいて、その重みに負の値がない・・・つまり重みが正であることを前提にしています。この構造上の仮定によって、貪欲的手法を取ることができるのがその特徴で、結果ベルマン・フォード法などの汎用的なアルゴリズムよりも計算量的に有利になります。 ダイクストラ法では、始点から各頂点への到達コストを最初に \infty と置いて、そこから緩和操作によって徐々にそれらを最適コストまで収束させていくわけですが、このとき グラフの頂点集合からその時点で最小のコスト

    Haskell で、優先度付きキューを使ったダイクストラ法
  • Haskellで円周率1億桁を計算する、あるいは円周率計算にHaskellの多倍長整数の改良を見る - 純粋関数空間

    きっかけ http://d.hatena.ne.jp/itchyny/20120304 この記事を見て、私も昔円周率を計算したことがあるのを思い出しました。 http://d.hatena.ne.jp/tanakh/20070506#p1 公式は同じくチュドノフスキーを使用、GHCのIntegerをそのまま用いて円周率を計算、 当時(5年前)のマシン(おそらくCore2あたり)で1億桁が15分ほどだったようです。 SPOJというサイトのコンテスト向けに、 $\sqrt{2}$ 200万桁計算の高速化 をCで書くとこから始めて、 ナイーブ乗算、カラツバ法、そしてFFT乗算の実装にいたり、円周率へ。 最初AGMを実装し、 古くて新しい方法、Arctan系の公式の実装を経て Binary Splitting Methodを知り、 チュドノフスキーの公式へ至りました。 さらにHaskellでの実装

  • OCaml の let と let rec はなぜ別扱いになっているのか、決定版、もしくは OCaml 暦十何年だったか忘れたけど仕事で Haskell を一年使ってみた - camlspotter’s blog

    はじめに断っておくが、全部Pros/Consのあるデザインチョイスなので、こうじゃなきゃいけないってことではない。ただ、 OCaml はこの選択をした、そいう事だ。 前回の「経験15年の OCaml ユーザーが Haskell を仕事で半年使ってみた」 http://d.hatena.ne.jp/camlspotter/20101212/1292165692 のような易しい文章ではないのでわからない人はとことん判らないだろう。まあ勘弁して欲しい。 あと、面倒だろうが、読む人は全部常体を敬体にして最後に「と思います」をつけて読んでくれ。ください、と思います。 Shadowing は便利であると思っている OCaml の let は非再帰なので以前定義された名前に別の値の束縛をオーバーライドできる。OCaml の人はこれが便利だと思っており皆普通に使っている。詳しくは http://d.hat

    OCaml の let と let rec はなぜ別扱いになっているのか、決定版、もしくは OCaml 暦十何年だったか忘れたけど仕事で Haskell を一年使ってみた - camlspotter’s blog
  • 輪廻はIOモナドだった。またはIOモナドは輪廻だった - セカイノカタチ

    みなさん、輪廻してますか? 「輪廻とはなんなのでしょうか?」という話題にも興味があるのですが、それは今回は置いといて、この話は完全にネタです。^^; まず、輪廻と一口に言っても、仏教だけの用語ではなく、インド方面に広く浸透している考え方なので、様々な解釈があり得ると思います。 そのため、ここでは、輪廻のモデルを「仏教思想のゼロポイント: 「悟り」とは何か」から引用します。 まず、「無我」であるところの衆生が輪廻する仕組みについて確認しておこう。この点については、明治生まれの仏教学者で、かつての東京帝国大学教授であった木村泰賢による図式がわかりやすいので、次にそのまま引いておこう。 A-A'-A''-A'''-An...anB-B'-B''-B'''-Bn...bnC-C'-C''-C'''-Cn...cnD......dnE... ここにA、B、C、D、Eとあるのは、木村の用語で言えば「五

    輪廻はIOモナドだった。またはIOモナドは輪廻だった - セカイノカタチ
    l-_-ll
    l-_-ll 2021/10/12
    「IOモナドは、世界を受け取り、ちょっとだけ変化した世界を返します。」
  • とほほのHaskell入門 - とほほのWWW入門

    「ハスケル」と呼びます。 数学者・論理学者の Haskell Curry の名前に由来しています。 LISP, ML などの言語の影響を受けています。 関数型プログラミング言語 であり、特に 純粋関数型言語 に分類されます。 金融、セキュリティ数学・科学解析、構文解析などの分野での利用例があります。 関数型プログラミングに慣れていない人にとっては、多少学習コストが高いようです。 遅延評価 を採用しており、式は記述されていても必要となるまで評価されません。 関数型言語ですが、モナド などを利用することにより、手続き型言語のような記述も可能です。 Haskell 1.0 (1990年)、Haskell 98 (1999年)、Haskell 2010 (2009年) などのバージョンがあります。 コンパイル型言語ですが、スクリプト言語の様にインタプリタで呼び出すこともできます。 処理系は、イン

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

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

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