タグ

Haskellに関するhajimehoshiのブックマーク (206)

  • Tech Notes: Why not Haskell?

    At one point, I think I qualified as a Haskell ninja — I understood and used monad transformers, I had a bunch of modules up on the module sharing system including C bindings, I was even credited for providing feedback on a Haskell paper. But I haven't done any of that in months, maybe a year. And much like my post-mortem about why I stopped looking at O'Caml in 2005 (which I think in part is what

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

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

    遅延評価でデバッグが困難になる状況
  • コモナドを使った抽象化の威力をライフゲームで試してみた - Qiita

    class Functor m => Monad m where return :: a -> m a (>>=) :: (a -> m b) -> m a -> m b join :: m (m a) -> m a join = (>>= id) k >>= m = join $ fmap k m extract は return と、extend は >>= と、duplicate は join と、それぞれなんとなく反対になってるような気がしますよね?(m と w も上下反対の対応がありますねw) コモナドの感覚を掴むために具体的な実装を見てみましょう。 -- | List Zipper data Z a = Z [a] a [a] left, right :: Z a -> Z a left (Z (l:ls) c rs) = Z ls l (c:rs) right (Z ls c

    コモナドを使った抽象化の威力をライフゲームで試してみた - Qiita
  • Haskellらしさって?「型」と「関数」の基本を解説!【第二言語としてのHaskell】 - エンジニアHub|Webエンジニアのキャリアを考える!

    Haskellらしさって?「型」と「関数」の基を解説!【第二言語としてのHaskell】 第二言語としてHaskellを学ぶ道案内。開発環境の準備から、Haskellらしいプログラミングの考え方まで、Haskell-jpのigrepさんが丁寧に解説します。 こんにちは。Haskell-jpの山悠滋です。 この記事では、すでにプログラミング経験のある方向けに、第二言語としてHaskellを学ぶ道案内をしていきます。 環境の準備や、自明なサンプルプログラムの紹介にとどまらず、Haskellらしいプログラミングの考え方も伝えていく予定です。 Haskellについて Haskellというと、「関数型」というキーワードが思い浮かぶ方も多いと思います。 確かにHaskellは、すべての関数がカリー化されており、それらを組み合わせてプログラムを書いていく関数プログラミングがしやすい言語です。 しかし

    Haskellらしさって?「型」と「関数」の基本を解説!【第二言語としてのHaskell】 - エンジニアHub|Webエンジニアのキャリアを考える!
  • Wandboxを支える技術(2017年版) - Qiita

    Wandbox は、オンラインでコンパイルや実行が試せるサービスで、主に私(@melponn) と @kikairoya で作っています。 以前 Wandboxを支える技術 というのを書いていたのですが、そこからかなり変わっているため、改めて今の中身がどうなってるかについて書いていきます。 Wandbox は、Wandbox 体と、各種コンパイラをビルドするための Wandbox Builder に分かれています。 ソースコードは wandbox と wandbox-builder にあります。 2019/9/26 追記: Wandbox のビルドを CMake に移行した話 を書きました 犬小屋と牛舎 Wandboxはバックエンドとフロントエンドで分かれていて、フロントエンド側が 犬小屋(kennel) 、バックエンド側が 牛舎(cattleshed) という名前になっています。 犬小

    Wandboxを支える技術(2017年版) - Qiita
  • Haskell Programming

    We're writing this book because many have found learning Haskell to be difficult and it doesn't have to be. Learning Haskell from the ground up is easier and works better - for both experienced hackers and people new to programming. The language is different enough from any you might've already tried that building up from the foundations will be less difficult and more enjoyable. If you are an exp

  • 関手, 自然変換とHaskell

    $\require{AMScd}$ 最近, Mathjaxで遊んでいるので, それを使って, 関手と自然変換について調べたことのメモ. 関手とHaskellのFunctor 関手$F$は圏$X$から$Y$へ対応を表し, 圏$X$の各関数$f : A \rightarrow B$を $F(f) : F(A) \rightarrow F(B)$ として移すものです. 関手は元の圏の関数について合成則を保存し, $f : A \rightarrow B, g : B \rightarrow C$,を関手$F$によって移すと, $F(f) \circ F(g) = F(f \circ g)$という性質を持ちます. また, 元の圏の各対象Xについて, 移した先の関手$F(id_X)$の射もその先の対象の$id$射となります. Haskellにおける関手$F$は, 名前も性質もmap関数に似ています.

  • 難しいのは見た目だけ!?Haskellのモナドの「たった2つのルール」を簡単に理解する! - Qiita

    この記事は Wantedly Advent Calendar 25日目の記事です。 最終日です!気合いが入りますね!! Introduction 今回は Haskell のモナドの話をしたいと思います。 Haskell を学び始めた時、誰もが一度は経験するのが「モナドって何だ?」という疑問です。「Haskell モナド」で検索してみても、圏論を絡めた小難しい説明ばかりが出てきて、よく分からない事が往々にしてあります。 ところが、実は「Haskell におけるモナド」を理解する為に、圏論のモナドを理解する必要はありません。何故なら、「Haskell においてモナドである」為に必要なのは、「たった2つのルールを満たす事」だけだからです! この記事では、「モナドとは何か」を簡単に説明したいと思います!! Haskell におけるモナドとは? Haskell におけるモナドとは、誤解を恐れずに言え

    難しいのは見た目だけ!?Haskellのモナドの「たった2つのルール」を簡単に理解する! - Qiita
  • ポイントフリースタイルへの道 〜最大公約数編〜 - Qiita

    概要 標準入力から改行区切りで2つの数を読み込み、最大公約数を出力するプログラムを題材にして、ポイントフリースタイルの練習を行います。 出典 出典は anarchy golf - Greatest Common Divisor です。 35byte が Haskell における最短コードらしいので、それを目指して頑張ります。 実装 単純な実装からポイントフリースタイルへ頑張って変換していこうと思います。 ナイーブな実装 まずは do 記法を使って単純に記述します。

    ポイントフリースタイルへの道 〜最大公約数編〜 - Qiita
  • Haskell Advent Calendar 13日目: シンセサイザーで理解するArrowプログラミング - モナドとわたしとコモナド

    Haskell Advent Calendar 13日目の記事です。 ごきげんよう。 今年も音楽の冬がやってまいりました。Haskellより音楽のほうに力を注いでいる気がするこの頃ですが、ふとこう思いました――「Haskellでシンセサイザーを作たらとても楽しいのではないか?」 シンセサイザーの仕組みは、たとえばFM・減算式ならこうなります: しかし、これが実装出来てもあまり嬉しくない、というのはわかっていただけるのではないでしょうか――そう、ただのシンセサイザーではなくどんなシンセサイザーでも作れるフレームワークが欲しいのです。 部品を作る部品 -Artery- まず、私は、部品同士を「配線」できるようにするため、arteryというパッケージを作りました。 ArteryはArrowとしてのインターフェイスを持っています。Arrowはごく簡単に表現すると、以下のようなクラスで表現されます(

    Haskell Advent Calendar 13日目: シンセサイザーで理解するArrowプログラミング - モナドとわたしとコモナド
  • What does let 5 = 10 do? Is it not an assignment operation?

    Ask questions, find answers and collaborate at work with Stack Overflow for Teams. Explore Teams Collectives™ on Stack Overflow Find centralized, trusted content and collaborate around the technologies you use most. Learn more about Collectives

    What does let 5 = 10 do? Is it not an assignment operation?
  • ArrowLoop - 言語ゲーム

    さて、気分を変えて ArrowLoop をやります。論文に書いてある loop f b = let (c,d) = f (b,d) in c の意味が全く分からなくて Arrow の勉強が一ヶ月近く停滞していたのですが、id:MaD さんが素晴らしい解説 http://d.hatena.ne.jp/MaD/20070818 を書かれているので自分なりに写経します。loop を使って普通のループを作るには、引数として関数を一つ与えます。関数の型は (b,d) -> (c,d) のような入出力ともタプルとします。よくある図で示すと、タプルの後ろの引数がくるりと入力に繋がれる形をしています。 import Control.Arrow nonsense (b, d) = (b + 1, d * 2) -- *Main> loop nonsense 1 -- 2 -- このしようも無い例では、b +

    ArrowLoop - 言語ゲーム
  • モナドって結局何なのよ? — join to Monad v0.1.3 documentation

    モナドって結局何なのよ?¶ Haskell を勉強しようとすると必ず「モナド」ってのが出てきます。困ったものです。数学とか圏論とか関係があるらしくって、何が書いてあるんだか分からなくって嫌になってしまいます。でもね、Haskell って凄いらしいじゃないですか、格好良いらしいじゃないですか。ここはちょっとがんばって色々考えてみましょう。 そもそも Haskell って何なのよ?¶ 何なんでしょうね、Haskell って。コンピュータ言語らしいんです、あ、それは分かってると。良く挙げられる性質は次な感じ?: 関数型言語 強い型付け 遅延評価 参照透過 ここでちょっと型に関して見てみましょう。試しに Haskell の実装の 1 つである Hugs で 1 について考えてみます。Hugs では :type や :info というコマンドで hugs に型の情報などを質問することができます。例え

  • https://qiita.com/hiyakashi_/items/1c1ec5445e7586a2fa06

  • bindはfmapとjoinに分解できる - Qiita

    数日前に頭の中で考えてた駄文。 モナドによって性質が大きく違うことからモナドは掴みにくいものだってのはよく言われることだけど、それは各モナドのbindの特色がfmapに入っているかjoinに入っているかにも関連するのかなと思った。 例えば、ListやMaybeだと、joinは皮を剥ぐだけで面白いことは何もしてなくて、fmapにその特色が入っている。 instance Functor [] where fmap = map map :: (a -> b) -> [a] -> [b] map _ [] = [] map f (x:xs) = f x : map f xs 逆にStateやIOモナドのfmapは値を普通に関数適用するだけで背後にある状態はまったく触らない。面白いことをやっているのはjoinの方で、状態の変更を外側,内側、と順番に逐次処理する役割を担っている。 join :: (M

    bindはfmapとjoinに分解できる - Qiita
  • Re: Haskellの勉強で詰まってる部分 - maoeのブログ

    mizchi.hatenablog.com Haskellを習得する上で難しいポイントだと思います。大きく分けると次の二つにまとめられるのではないかと思います。 コードの中で現れる識別子からそれが何なのかを探しづらい Cabalがつらい それぞれ個人的な見解を書いてみます。 コード中の識別子の探し方 モナドのところの <$> とか <*> とか、え〜どっちがApplicativeで何がFunctorだっけ、そもそもその定義はなんだったっけ。え〜あ〜〜〜みたいになる。 と名前空間の そして名前で役割を推測することが困難な事が多々ある。mapM_ とか、前述した演算子とか。いや mapM_ は map があって mapM があって、っていう段階があるのは理解しているけど、ソース読んでて突然出現するそれには全く対応できない。 はどちらも識別子から型がわかれば大部分が解決します。ありがたいことに近

    Re: Haskellの勉強で詰まってる部分 - maoeのブログ
  • Haskellでの合成可能なオブジェクトの構成とその応用

    Haskellでの合成可能なオブジェクトの構成とその応用 木下郁章, 山和彦, 2015 Haskellで状態を管理する際は、 一般的に代数データ型や型クラスが用いられるが、 データが拡張できないか、動的な性質を持たない。 そのためHaskellは、 複雑な状態を扱う問題領域には適していないと考えられてきた。 一方で、一般的なオブジェクト指向言語では、 オブジェクトを提供することでこの問題領域で成功を収めている。 論文では、Haskellの言語仕様を変更することなしに、 オブジェクト指向言語から着想を得たオブジェクトを実現する。 論文で提案するオブジェクトは圏を構成し、合成を用いて継承を表現できる。 また、終了する運命にあるオブジェクトやストリーミングなどに応用でき、 複雑な状態を扱うゲームの実装にも使われている。 論文をダウンロード(PDF) PPL 2015 発表スライド ここに

  • https://qiita.com/minpou/items/34a67281b4b746bc5fcc

  • Haskell Language

    primes = filterPrime [2..] where filterPrime (p:xs) = p : filterPrime [x | x <- xs, x `mod` p /= 0]

  • モナドトランスフォーマーとその周辺 - Qiita

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

    モナドトランスフォーマーとその周辺 - Qiita