haskell-jp / questions #57

TermSucc TermZero などが書ける
@ekmett has joined the channel
aws-lambda-haskell-runtime で同様の現象を経験しました。メモリの割り当てを増やしながらベンチをとったところ 1sec 程度までは改善しましたが、それ以上縮まらず実用は諦めました。
たとえば、「a -> a を満たす実装は一つ(id)しかない」は、何の定理から言えることですか? theorem for free だと思って読んだんですが、それらしいことが書かれているとは思えませんでした。
∀a. a -> a という論理式で考えれば、「Int -> Int ∧ Char -> Char ∧ ... ∧ SomeType -> SomeType」と無限論理積に展開できるので、自明に id しか存在しないと考えていますが、どうなんでしょう?
直感的にはそうなんですが。。。
fmap の実装は一つしかないは、どこから来るのかが元々の疑問で、まず簡単な a -> a から質問しました。
多相関数を数える()かな
aの構成方法が未知なので引数としてもらったものをそのまま返す関数しか構成できないからですね
もちろんHaskellではundefinedがあるのでidの他にもう一つconst undefinedがあります。
なので関数(全域関数)なら一本しかなくHaskellのように部分関数まで考慮するなら二本になる
というような話を上の @nobsun の記事に対して書いたのが https://qiita.com/cutsea110/items/3496394968cb7ac73047
このまえMizunashi_Manaさんから教えてもらったんですが、Parametricityという性質らしいです。 https://www.well-typed.com/blog/2015/05/parametricity/
Theorems for freeについては読んだ事がないのですが、上の記事中にはFree theoremの事が出てきている模様
free theorems については,
https://reasonablypolymorphic.com/blog/theorems-for-free/
http://www21.in.tum.de/~boehmes/diplomathesis.pdf
とかが分かりやすいかもです.で, id については次の theorem が得られます

forall f => id' . f = f . id'


これは, https://alexknvl.com/cgi-bin/free-theorems-webui.cgia -> a で theorem を取得するといいと思います.

ここで,例えば任意の x について f = const x を考えてみると,
id' (const x y) = const x (id' y)
<=> id' x = x

となるため, id の free theorem から f :: a -> a; \x -> x が一意に決まります
( lambdabot が Slack で導入できるらしいので, lambdabot で free theorem が取得できるとこういう時便利だなと思いました) (使う機会あるのかな?)
ついでに, fmap の一意性については,簡単な証明を先日降臨された ekmett 先生が書いてます: https://www.schoolofhaskell.com/user/edwardk/snippets/fmap
こちらは, fmap' id = id を仮定した時に fmap' :: (a -> b) -> (f a -> f b) の free theorem から fmap' f = fmap f が示せるため一意であるという感じですね
@ogata-k has joined the channel
みなさん、ありがとうございます。大変勉強になりました。
@furugomu has joined the channel
@ has joined the channel
@ has joined the channel
Yasuaki Takebe
@Yasuaki Takebe has joined the channel
@stephan has joined the channel
@ has joined the channel
@ has joined the channel
@Nash has joined the channel
@r6eve has joined the channel
Masamichi Sato
@Masamichi Sato has joined the channel
@neko has joined the channel
@speedcell4 has joined the channel
Masaya developer
@Masaya developer has joined the channel
Masaya developer
はじめまして! 関数型プログラミングに興味があってHaskellを学んでみたいと思ってます。
早速質問なんですが、日本語でHaskellを勉強するには何がいいと思いますか?
あの絵本みたいなチュートリアルの日本語版の書籍を買うのがいいんでしょうか?
教えていただけると幸いです!
そうですね。いろいろ古い部分はありますが、今でもすごいH本が個人的におすすめです。
https://www.amazon.co.jp/dp/B009RO80XY/
古くなっている部分については https://qiita.com/Aruneko/items/e72f7c6ee49159751cba をご覧ください。

また、入門記事が https://wiki.haskell.jp/Links#%E5%85%A5%E9%96%80%E7%B3%BB にまとまっています。
こちらはいずれもお金がかからないので、一度目を通してみるといいかと思います。
.oO(「いやこれを読め」という方は引き続きコメントを!特に入門書を書いた人とか!)
Masaya developer
教えていただきありがとうございます!なるほど、やっぱりあの書籍は買ったほうが良さそうですね。無料で見れるものまで紹介していただき、本当にありがとうございます!
ご紹介いただきありがとうございます!
記事について質問があればお気軽にどうぞ!
@keserasera has joined the channel
Masaya developer
ご本人から!わざわざありがとうございます!
Masaya developer
ぜひとも、「すごいHaskell」を読む際は参考にさせていただきたいと思います!
@rst76 has joined the channel
@k-endo has joined the channel
@GolDDranks has joined the channel
すみません、Haskellの書籍のおすすめを聞きたいんです。Haskellについては全くの初心者です。(背景はRustやPythonです)会社の本棚に本を買おうと思いますので汎用的な書籍だと助かります。読みそうな人はPythonやRやってる人だと考えておすすめしてください!
@kyotsuya has joined the channel
extensible についてです。
このようなタイプ↓があります。
newtype Required a = Required a
newtype Optional a = Optional (Maybe a)

type PersonParams =
  Record
  '[ "name" >: Required Text
   , "age" >: Optional Int
   ]


これをこのように↓バラすことってできますでしょうか?
type PersonRequiredParams =
  RecordOf Required
  '[ "name" >: Text
   ]

type PersonOptionalParams =
  RecordOf Optional
  '[ "age" >: Int
   ]
key や value はポリモーフィックに扱いたいです。
こういう関数ならかけますけど Required aOptional b は知らないです。
hello :: Associate "name" Text xs => Record xs -> Text
hello r = mconcat [ "Hello ", r ^. #name, "!"]
ちょっと質問点がわかりにくかったかもしれないですね。
やりたいのはこういうことです。