Skip to the content.

Haskell入門

従来の言語では問題を部分化する方法について概念的な限界がいくつかある。関数型言語はこれらの限界を押し広げるも のである。 なぜ関数プログラミングは重要か

関数プログラミングを習得するには,これまで命令プログラミングで培った技術はいったん忘れ,真っ白な気持ちで臨む必要があります。関数型の山を登るためには,命令型の山を降りなければなりません。 第1章 関数プログラミングは難しくない!

  1. Haskellは理解すれば理解するほどきれいに書けることを約束してくれます。信頼してください
  2. 常にパターンを探しましょう。単純になるとき、またその時だけそれらを抽象化するのです
  3. 辛抱強く抽象化を正しく理解しましょう。もしそれが出来たならすべてのことが魔法のようにつじつまが合うようになるでしょう。
  4. 実装そのものが設計図となります … Haskell Maxims and Arrows

なぜHaskellを学ぶのか

日本語チュートリアル

講演資料

書籍

英語チュートリアル

Examples

> fib = 0 : 1 : zipWith (+) fib (tail fib)
[0, 1, 1, 2, 3, 5, 8, 13, ...
フィボナッチ数列 * [Haskellのキモいフィボナッチ数列がやっと理解できたからこれでもかという程に細かく説明してみた #Haskell - Qiita](http://qiita.com/Tatsuki-I/items/97bdf8c2579b31b62fd8) * [Haskellでフィボナッチ数列 〜Haskellで非実用的なコードを書いて悦に入るのはやめろ〜 - Qiita](https://qiita.com/mod_poppo/items/4f78d135bb43b7fd1743) * [sketches/trouble-in-paradise-fibonacci at master · effectfully/sketches](https://github.com/effectfully/sketches/tree/master/trouble-in-paradise-fibonacci)

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

-- ghci> primes
-- [2,3,5,7,11,13,17,19,23,..
エラトステネスの篩 * [The Genuine Sieve of Eratosthenes](http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf) * [Haskell programmers are liars](http://www.garrisonjensen.com/2015/05/13/haskell-programs-are-lies.html) * [The Genuine Sieve of Eratosthenes \| Patterns in Functional Programming](https://patternsinfp.wordpress.com/2021/05/10/the-genuine-sieve-of-eratosthenes/) * [[1811.09840] Three Euler's Sieves and a Fast Prime Generator (Functional Pearl)](https://arxiv.org/abs/1811.09840)

let (m ~> str) x = str <$ guard (x `mod` m == 0)
in map (fromMaybe . show <*> 3 ~> "fizz" <> 5 ~> "buzz")
FizzBuzz * <https://www.reddit.com/r/haskell/comments/2cum9p> * [Haskellで書かれたおもしろいFizzBuzz ― Haskellで読めないコードに遭遇した時に解読する方法を徹底解説!](http://itchyny.hatenablog.com/entry/2015/12/27/150000) * [Everyone needs a FizzBuzz](http://jeffreyrosenbluth.github.io/2017/02/05/fizzbuzz.html)

{-# LANGUAGE OverloadedStrings #-}
module Main where

import Data.Monoid
import Web.Spock.Safe

main :: IO ()
main = runSpock 8080 $ spockT id $ do
  get root $ text "Hello World!"
  get ("hello" <//> var) $ \name ->
    text ("Hello " <> name <> "!")
Web Application * [Spock](https://www.spock.li/)

Exercise