型
- 【Haskell】 言葉の定義まとめ(型クラス、型コンストラクタ、値コンストラクタ、型引数など) - takafumi blog
- Kwang’s Haskell Blog - Type Isomorphism
- These, Align, and Crosswalk
- These Changes
- tatterdemalion - Types & Kinds
- CS Syd - Overcoming Boolean blindness with Evidence
- Typing is Hard
- Haskell mini-patterns handbook :: Kowainik
- Types as axioms, or: playing god with static types
- Towards Tactic Metaprogramming in Haskell :: Reasonably Polymorphic
- Haskellの「型」で混乱したので整理してみた - Qiita
- Names are not type safety
- pureblog - A combinator library for taxes
基本型
- haskell の Int と Integer の違いや Float や Double や Rational を理解する - Qiita
- Unit型の何が偉大なのか説明してみる - Qiita
- Haskell equality table
- 意外と知らないType defaulting - Qiita
- だれも Data.Maybe を教えてくれなかった - Qiita
なぜ型が重要か
- Type Safety Back and Forth
- Keep your types small…
- The Basic, Practical Benefits
- jaspervdj - On Ad-hoc Datatypes
- good-design-and-type-safety-in-yahtzee
- Parse, don’t validate
- Haskell for all: The golden rule of software quality
型を定義する3つの方法
- type
- data
- newtype
type
型シノニム
data
代数的データ型とは”足し算”と”掛け算”が出来るような型のこと。”足し算”はEither a b
、”掛け算”は(a, b)
と対応する。
- Haskell Diary #2 - Algebra of Data Types
- 代数的データ型と初等代数学 - ryota-ka’s blog
- The algebra (and calculus!) of algebraic data types
- 代数的データ型のデータのとりうる数を微分すると1穴空きデータ型の数になる話 - Qiita
- Adαm Schønemαnn - Pattern matching ADTs
- Void Is a Smell | Freckle Education
Codata
- A Neighborhood of Infinity: Data and Codata
- Codata in action, or how to connect Functional Programming and Object Oriented Programming
newtype
既存の型と同型な別の型を定義することができるが、コンパイル後の表現は既存の型と同一になるので効率の面で利点がある。1つの値コンストラクタと1つのフィールドを持つdataで定義された型との違いは以下のように現れる。
> newtype A = A Int
> checkA (A _) = "OK"
> chackA undefined
"OK"
> data B = B Int
> checkB (B _) = "OK"
> checkB undefined
"*** Exception: Prelude.undefined
- Newtype - HaskellWiki
- Haskellのnewtypeとdataの違い - Qiita
- すごいH本で見落としがちだが実は重要な機能:newtype - Qiita
- 本当はすごい newtype - Speaker Deck
- Names are not type safety
型注釈
- Type annotations for an external function may require not only its type structure, but also references to the type names or implementations (i.e. import of modules where these types are declared).
- Partial type signatures still require the type structure of the function (making use of the scaffold of the type signature).
- Visible type applications is the tersest and cleanest way to annotate an external function’s type. It does not require re-building of the type signature in case of ambiguity.
Тех-Детали: Type annotations vs partial type signatures vs visible type applications
多相型
レコード
関数
- A simple Haskell function
- Composing bijections, surjections, and injections
- Eastman maximal comma-free codes in Haskell
- Descriptive Variable Names: A Code Smell
- map関数
- zudov/24-days-of-syntactic-witchery: Aligning characters for fun and profit, with Haskell and PureScript
- 美術の人が考える Haskell - Qiita
- Haskellの($)と(.)の違い - Qiita
- Another Approach to Default Function Parameters
- Ceci n’est pas un default
- Return a Function to Avoid Effects
- Haskell で「エラトステネスの篩」 その1 - Qiita
- Haskell で「エラトステネスの篩」 その2 - Qiita
- Haskellの関数の型とかカリー化とか #Haskell - Qiita
- haskellで2重リストにmapを適用させる例 - Qiita
- Haskell - $の仕組みを覗いてみよう - Qiita
- Compose Tetris - Fintan Halpenny - Medium
- named: Named parameters (keyword arguments) for Haskell
- Don’t think, just defunctionalize – Blog – Joachim Breitner’s Homepage
- Many faces of Internal Functions :: Kowainik
- Hyperfunctions - Donnacha Oisín Kidney
パターンマッチ
- Pattern matching
- PATTERN MATCHING: WOT’S… UH THE DEAL?
- Pattern and Guard Extensions
- Haskell で条件分岐
- コピペしてすぐ確認できるHaskellの条件分岐
- The four simple ways to encode sum-types
- Pattern matching
- [2108.13114] Embedded Pattern Matching
多変数関数とカリー化
curry :: ((a, b) -> c) -> a -> b -> c
uncurry :: (a -> b -> c) -> (a, b) -> c
Haskell 初心者は括弧ばかりの Lisp のようなコードを書く。中級者になると、($) が多くなる。上級者(言い過ぎか?)になると、($) が消えて、(.) が多くなる。
出典: 関数合成の妙技
ポイントフリー
必要のないところでポイントワイズに書く必要はないが、あまりポイントフリーに拘りすぎないのも大事
- ポイントフリースタイル入門
- Haskellのフクロウ ((.)$(.))
- Blunt
- “Point-Free or Die: Tacit Programming in Haskell and Beyond” by Amar Shah
遅延評価
- Schrödinger’s cat
- Résumé
- 正格評価と遅延評価(基本編)
- 正格評価と遅延評価(詳細編)
- takenobu-hs/lazy_evaluation
- なぜHaskellでタライ回しが速いのか、あるいは遅延評価とSTG
- An example of using laziness
- All About Strictness
- Visualizing lazy evaluation
- Adaptive Evaluation of Non-Strict Programs
- fixpt - All About Strictness Analysis (part 1)
- Thinking Functionally with Haskell勉強メモ: 第7章1 メモリ、計算量、
seq
- Arantium Maestum - 正格性のすべて (翻訳)
- Laziness Quiz
- Haskellにおいて遅延評価は諸刃の剣であり、注意すべきであるという話 - Qiita
- The Incomplete Guide to Lazy Evaluation (in Haskell)
- If Haskell were strict, what would the laziness be like?
- How to force a list
- Thinking with Laziness
- How Laziness Works
- さようなら遅延評価 - あどけない話
- apfelmus - The Incomplete Guide to Lazy Evaluation (in Haskell)
- 続くといいな日記 – 遅延評価でデバッグが困難になる状況
- Being lazy without getting bloated - IOHK Blog
- [1502.03216] Simulation in the Call-by-Need Lambda-Calculus with Letrec, Case, Constructors, and Seq
- nested-strict-data
- Make invalid laziness unrepresentable
One very interesting comparison is that lazy evaluation is to the CPU what garbage collection is to memory.
出典: http://scott.sauyet.com/Javascript/Talk/2014/01/FuncProgTalk/#slide-40
メモ化
遅延評価を利用したメモ化の実装例
fibs :: [Integer]
fibs = map fib [0..]
fib :: Int -> Integer
fib 0 = 1
fib 1 = 1
fib n = fibs !! (n-1) + fibs !! (n-2)
参考: Can someone explain the concept behind Haskell’s memoization?
正格評価
- fixpt - All About Strictness Analysis (part 1)
- fixpt - All About Strictness Analysis (part 2)
- Strict拡張でハマったお話 - Qiita
- Strict拡張を使用する際の注意点 - Haskell-jp
部分関数
- Partial Function Considered Harmful
- https://twitter.com/GabrielG439/status/671803691591077888
- 24 days of Hackage, 2015: day 16: safe; what is safety anyway?
- 部分関数をどう扱うか(spoonの紹介)
- The spoon package
多相型
命名規則
演算子
- Generalizing function composition
- Haskell Symposium 2012. Koen Claessen: Shrinking and showing functions
- Making a fast curry Push/enter vs eval/apply for higher-order languages
- A Pragmatic Case for Static Typing with Brian Hurt
- On stateless software design: what is state ?
- Does Haskell make promises it can’t keep? or The big problem with wrapping numeric types
- Haskell/GHC 記号の意味を検索するためのリファレンス集 - Qiita
- Follow the Denotation :: Reasonably Polymorphic
- Combinatorics of Permutations: Introduction
- Haskell のモジュールとパッケージの基礎知識 - Qiita
- Haskell でも heredoc がしたい - Haskell-jp
- accidentally-exponential
- Idiomatic Haskell : haskell
- Haskell/GHC symbol search cheatsheet