関数型プログラミング言語Haskell Part30 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/01/15(日) 23:43:54.28ID:Vh4eztBk
関数型プログラミング言語 Haskell について語るスレです。

haskell.org (公式サイト)
http://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part28
http://echo.2ch.net/test/read.cgi/tech/1428597032/
2017/02/15(水) 13:18:52.67ID:jktpXUxB
えっ、Modula-2とかCより読み易くて
低レベルのシステム記述も出来たのに
全然普及せんかったでw

政治的理由と思うが突然Turbo Modula-2
の販売が中止になってTurbo-C出たけどね。
2017/02/15(水) 17:36:32.27ID:kkhdLQ6B
出た! 陰謀論!
2017/02/16(木) 00:44:11.97ID:PsfAYoHu
流行り廃りに合理的な理由なんてない。
2017/02/16(木) 04:02:18.89ID:zxmzXW5F
普及言語からHaskellに乗り換えに難しく感じる部分

・do記法は関数で構成されるという関数型プログラミングの理解のための学習の邪魔をする(混乱させる)
・型を気にせず書けるスクリプト言語からだと強力すぎる型推論のおかげで型があるという感覚になじめず型に関するエラーでイラ立つ
・C言語系からだとreturnがreturn構文じゃない、if-elseが式である
・イミュータブルしかない、再代入が出来ない、(ように感じ)思うようにコード書けず辛い
・Haskellについて語る書の書き方や視点が数学寄りのものが多く理解が難しい(奴らが言うようなこまけえ数学っぽいこと気にせんでもコードは書けるっちゅうに純粋さにこだわりすぎ)
2017/02/16(木) 15:22:31.85ID:VWTLMYuE
そもそもハスケルの強みって何?
計算時間ではビジュアルスタジオに遠く及ばないだろ?
描画とか数学的処理も他の高級言語使った方がよくね?
2017/02/16(木) 16:47:16.10ID:fRybmYDX
仕様記述言語の強み
自分が強くなるために右往左往するよりも
強くなりたいならああしろこうしろと指図して右往左往させる側
149デフォルトの名無しさん
垢版 |
2017/02/16(木) 18:17:34.39ID:VWTLMYuE
右往左往の意味がよく分からんが、自分が考えて手を動かす量が減るということかな?
2017/02/16(木) 19:16:01.32ID:9Ohg+UxU
Haskellでゲーム作りたいです!
2017/02/16(木) 20:28:16.21ID:qwVWj3LU
言語仕様はともかく実行環境がおそ松すぎる
2017/02/16(木) 21:04:48.77ID:lgZA8NJM
>>151
どのような意味で言っているのかよく分かりません。
もう少し詳しく説明していただけないでしょうか。
2017/02/17(金) 08:05:51.13ID:nCBINic8
>>151
腐女子なの?
2017/02/17(金) 08:37:50.87ID:iKIs1hpk
遅いと言われようと、フィボナッチ数列をzipWithで1行で書ける言語というところに魅力を感じている
(そんなに何度もフィボナッチ数列を書く機会があるわけではないが表現力の一例として)
2017/02/17(金) 10:28:30.13ID:nCBINic8
1行フィボナッチって結構あるんだな全然知らなかった

https://wiki.haskell.org/The_Fibonacci_sequence
2017/02/17(金) 13:55:10.09ID:gJ+iD/w/
パスカルの三角形を出したいんだけど、
++使ってるのが気に食わないのだがうまく消せなかった
import Data.List (unfoldr)
pastri :: [[Int]]
pastri = unfoldr (\l -> Just (l, body l)) [1]
    where
      body xs = 1 : zipWith (+) xs (tail xs) ++ [1]
main = mapM_ print $ take 15 pastri
2017/02/17(金) 19:08:56.34ID:ishbEDrB
型に関数型のデータを持たせることはできますか?
GHC.TypeLitsで自然数型のデータをもたせることは出来ましたがどうやら関数型は無いようです
ニュアンスとしては以下のような事をやりたいです
newtypeでaを定義し直しMonoidのインスタンスにすれば同じ処理は出来ますが
冗長性を省いてシンプルに記述したいです

newtype Hoge (f :: a->a->a) (a :: *) = Hoge a deriving Show

instance (Num a) => Monoid (Hoge f a) where
mempty = Hoge 0
(Hoge x) `mappend` (Hoge y) = Hoge (f x y)
2017/02/17(金) 20:56:35.22ID:BpdtDTW+
data Hoge a = Hoge (a -> a -> a) a
これだとHoge f 0とHoge g 0の型は同じになってしまう
引数fをgに変えると戻り値の型が変わるような関数Hogeは動的言語なら作れるかも
2017/02/17(金) 21:34:57.67ID:WL7YVLDK
>>156
長さが異なるリスト同士の zipWith で、短い方の末尾をデフォルト値で補って長さを揃える、
そんな関数 zipWith' を作ってはどうでしょうか。

zipWith' :: (a -> a -> a) -> a -> [a] -> [a] -> [a]
zipWith' _ _ [] [] = []
zipWith' f d [] (y:ys) = f d y : zipWith' f d [] ys
zipWith' f d (x:xs) [] = f x d : zipWith' f d xs []
zipWith' f d (x:xs) (y:ys) = f x y : zipWith' f d xs ys

これを使えば、例えば [1, 3, 3, 1] から [1, 4, 6, 4, 1] は次のようにして作れます。

let xs = [1, 3, 3, 1]
zipWith' (+) 0 xs (0 : xs)

この関数は一方だけでも無限リストだと止まらないので注意が必要ですが、
ときどき役に立つので私は自分のツールボックスに入れています。
2017/02/17(金) 22:22:44.78ID:nCBINic8
パスカルの三角形はロゼッタコードにあるのが限界でしょ

Pascal's triangle - Rosetta Code
https://rosettacode.org/wiki/Pascal%27s_triangle#Haskell
2017/02/18(土) 01:35:58.15ID:4ADoOqjk
>>156
以前にこんなのを書いたことがある
pascal :: (Integral a) => [[a]]
pascal = map (1:) $ (:) (repeat 0) $ zipWith (zipWith (+)) pascal $ map tail pascal

-- pascal =>
[
[1,0,0,..],
[1,1,0,0,..],
[1,2,1,0,0,..],
[1,3,3,1,0,0,..],
..
]

2重リストなんで見た目複雑だけど発想としては
fib = 0:1: zipWith (+) fib (tail fib)
とほぼ同じ
2017/02/18(土) 12:34:28.15ID:OQ3VgdS2
++をネタにする作者の気持ちをスルーしてパスカルの三角形を熱く語る
理系の鑑
2017/02/19(日) 07:14:56.06ID:rxEXn9HF
pascal = map (takeWhile (/= 0)) $ iterate (\xs -> 1 : zipWith (+) xs (tail xs)) (1 : repeat 0)

http://melpon.org/wandbox/permlink/HLKtAXzGodOF3ZGP
2017/02/19(日) 10:09:57.42ID:obWbRffz
ところで・・・

コメントを読まなくても、どのように計算しているのかがぱっと見て分かる、
それが関数型が持つ高い宣言性の良いところ。

また、そのようにプログラムしても、もともとGHCが持つ優秀な最適化能力や、
プログラムの見た目を壊すことなく最適化を促すことができる仕組みのおかげで、
結果的にかなり効率の良い処理がなされる実行ファイルが出力される。
(実用的なアプリケーションで十分に耐えられる)

にも関わらず、そのメリットをあえて潰すようなプログラムをする人が稀にいるが、
純粋関数型のHaskellを使っておきながら、他に優先すべき事項があるのだろうか。

まぁ、縛りパズルをして遊んでいるのなら分かるが。
2017/02/19(日) 11:37:29.74ID:TYcfVj75
今ここで言う必要のないものを必要と思い込むことも縛りのパターンの一つ
2017/02/19(日) 18:51:42.32ID:rxEXn9HF
どうしても難解になりがちはワンライナーやコードゴルフで遊ぶのは人の自由だと思うけど遊び以外で使うのはたしかにどうかと思う
2017/02/19(日) 19:20:27.12ID:Mzz/1Hry
ポイントフリー教も1変数のパイプみたいなやつならまだ分かるのだが
(中間変数が無くなるから効率が上がるという話もある、
そのくらいGHCが最適化してくれてもよさそうなのに)
2変数以上になると完全に暗号めいてて困る
2017/02/19(日) 20:52:17.90ID:TYcfVj75
xss = (1 : repeat 0) : [ zipWith (+) (0 : xs) xs | xs <- xss ]
pascal = [ takeWhile (/=0) xs | xs <- xss ]

これは2変数というか2重ループ
それと再帰のために自分自身に名前をつけた時点でポイントフリーは諦めている筈
2017/02/19(日) 23:43:55.15ID:rxEXn9HF
ポイントフリーって何?こういうこと?

pascal = map (takeWhile (/= 0)) $ iterate ((1 :) . map sum . transpose . take 2 . tails) (1 : repeat 0)

http://melpon.org/wandbox/permlink/bYSi5tfNVy5zfzPg
2017/02/20(月) 00:18:45.73ID:mtupkOQi
変数名かんがえたくないときポイフリできたらしちゃうことある
171デフォルトの名無しさん
垢版 |
2017/02/20(月) 00:20:11.39ID:bFWxmJHr
ArrowLoopの解釈はこれで合ってるの?

http://tamae.2ch.net/test/read.cgi/dame/1439747269/241-242n
2017/02/20(月) 20:56:54.49ID:uIdMc98M
ArrowLoopがどういうインターフェイスなのかいまいちよく分からないけど
その定義でどう動くかはfによるとしか・・・
2017/02/20(月) 22:57:03.60ID:tib6qfwe
結局ハードウェアの動きとあまりに乖離しすぎてるってのが
普及しない理由じゃないかと。
2017/02/21(火) 04:45:41.06ID:bkUsfADx
量子コンピュータが普及する時は言語どうなるんかな
CPUに合わせた新しい言語になるのか、今の言語をベースにコンパイラに任せるのか
原理とか全く知らなくて言ってるけど
2017/02/21(火) 11:55:34.70ID:hz5m2IGZ
メモリとCPUが分離しすぎているおかげでメモリ上のデータ構造に変化がない
OOPははそこを変えようとしたのか
分離するのやめれば破壊的イノベーションが起きるのではと
2017/02/21(火) 19:46:11.18ID:CLRDv6M0
ほんとぉ?
2017/02/21(火) 22:11:08.30ID:3rYbm5Zu
golangはOOPとは違うような
2017/02/22(水) 01:32:49.98ID:doFig/5A
tanakh神って色々とやられておられるのですね

http://hackage.haskell.org/user/HideyukiTanaka
2017/02/22(水) 11:25:20.39ID:C8G0Nbdq
ContrainedなFunctorを実装していて直面した問題です
問題の本質を以下の単純化したコードで例示します
最後2つのインスタンス宣言の間で"Duplicate instance declarations" エラーが発生してしまいます
これは型aがOldAとUsefulFoo両方のクラスのインスタンスである場合どちらのnewHogeを実行すればいいのか区別がつかないからですが
実用上このケースは無意味で意図してコードを書かなければ起こり得ません
OldAとUsefulFooの両方のインスタンスになるような型が存在しないことをghcに伝えられればエラーにしなくても良いと思うのですがそのようなテクニックや言語拡張はあるのでしょうか

{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}

class OldA a where
hoge :: a -> a

class NewA a where
newHoge :: a -> a

class UsefulFoo a where
us :: a -> a
ef :: a -> a
ul :: a -> a

instance OldA a => NewA a where
newHoge = hoge

instance UsefulFoo a => NewA a where
newHoge = us . ef . ul
180デフォルトの名無しさん
垢版 |
2017/02/23(木) 00:49:33.52ID:9wlFqT9C
諦メロン
2017/02/23(木) 06:24:32.19ID:1D9YdnQF
>>178
最近はRustに御執心の様子
2017/02/24(金) 02:19:21.58ID:bZ+UJBqj
>>179
OldAとUsefulFooとNewAの設計方針が間違っていたのでは?
2017/02/24(金) 11:52:40.03ID:e/BP7pNw
最新のGHCは簡単な余再帰が末尾再帰に変換されて最適化かかるの?
2017/02/25(土) 01:04:24.08ID:wcM+rtIC
>>182

http://melpon.org/wandbox/permlink/2dkmGhuBxpuIXnLU



http://melpon.org/wandbox/permlink/zMLvKlMSoP1i5EFb
2017/02/25(土) 06:14:09.47ID:rUogqkUr
これがアスペか
2017/02/25(土) 06:24:01.20ID:E4CT8R9/
fib_mem :: Int -> Integer
fib_mem = (map fib [0..] !!)
 where
  fib 0 = 1
  fib 1 = 1
  fib n = fib_mem (n-2) + fib_mem (n-1)
https://www.packtpub.com/mapt/book/Application%20Development/9781786464217/1/ch01lvl1sec09/Memoization+and+CAFs

フィボナッチは前スレのこれが美しすぎた。
これを見た後では
zipWithのフィボナッチとか完全に霞んで見える。
2017/02/25(土) 11:33:38.62ID:J8MTJSeU
数式に近いから美しいって言ってるのかもしれないけど
それは
fib_mem :: Int -> Integer
fib_mem x = _fibs !! x
_fibs = map _fib [0..]
_fib 0 = 1
_fib 1 = 1
_fib n = fib_mem (n-2) + fib_mem (n-1)
みたいに一時データがユニークになるって話だから
メモ化されるって言ってもO(n^2)だけどな
2017/02/25(土) 12:20:37.16ID:5RveVCtH
こんな所で感動しちゃってどうするの
そういうのは万策尽きて神頼みするような時だけいい
数学に感情は不要
2017/02/25(土) 18:51:36.03ID:A0aZ5Z9S
初歩的なメモ化で感動できた頃の心の輝きは大切にしていきたい
2017/02/25(土) 18:58:12.64ID:A0aZ5Z9S
メモ化してトップダウンするより足していってボトムアップの要領の良さが勝つ回
2017/02/26(日) 22:44:13.60ID:+sRU0DuI
stack new して作ったプロジェクトでライブラリを作りました。
(cabal ファイルに executable の代わりに library の項目を書いた)

stack build して正しくビルドされたことを確認してから stack install しました。

この後、別の stack new したプロジェクトで、先程 stack install したライブラリを使用するには、
どうすればよいのでしょうか。
2017/02/27(月) 10:48:09.56ID:TbO8J9W/
stack.yamlのpackagesから設定できるよ、stack installはしなくて良い https://docs.haskellstack.org/en/stable/yaml_configuration/
2017/02/27(月) 22:42:50.07ID:6zX/SjR0
>>192
出来ました。
ありがとうございました。
2017/03/01(水) 13:33:54.14ID:5kGyNHm4
諸君、議論したまえ
195デフォルトの名無しさん
垢版 |
2017/03/02(木) 08:35:24.25ID:jHvj97KG
http://tamae.2ch.net/test/read.cgi/prog/1475046306/812n

Haskellerが現れた
2017/03/06(月) 19:44:44.66ID:BYkqMHF2
新しく出たHaskell本の感想クレクレ
2017/03/06(月) 20:21:59.21ID:j+wBUtqM
前書きだけ立ち読みしたけど
あれ関数プログラミング入門を書き直したものなんだな
2017/03/06(月) 20:28:33.59ID:MHxEW6Wj
古い方持ってたら不要なのね
2017/03/06(月) 23:01:20.41ID:WL27y1mu
マジかよ危うく買うところだった
2017/03/07(火) 00:14:37.81ID:+xePePxn
かなり書き直してるよ
2017/03/07(火) 10:44:02.94ID:mr++RUpk
Bird氏の本の第三版か。
あの人、Functional Programmingの大御所なんだね。
すごいHやGraham氏、その他日本人著者の書いたのをいろいろ読んだけど、
コアな部分を理解するならBird氏の本だと思った。
翻訳第二版のファンシーな表紙をやめて、
原著の表紙の虎を持ってきたのは何かあったのだろうか?ww
2017/03/07(火) 13:07:01.84ID:H+HmLSCA
>>201
コアと言うのは、例えばどんな部分?
2017/03/07(火) 13:38:15.87ID:fYd9KAIw
と思ったらそもそも関数プログラミング入門買ってなかったのでこれを機会に買おう
2017/03/07(火) 17:44:15.63ID:rdG5C9r5
kinkyな表紙にしてくれ
2017/03/07(火) 17:49:10.46ID:mr++RUpk
>202
最初から正格、非正格を念頭に置いた上で議論が進んでいく。その時点で既に毛色が違う。
豆知識として、リスト内包表記とdo構文の<-の関係も載ってた。
証明問題が多く、数学がわかんないときつい感じ。
2017/03/07(火) 20:23:58.44ID:36OrCepo
>>205
あぁなるほど、そう言うのを一般に「コア」って言うのか

ありがと
2017/03/08(水) 06:06:40.10ID:XWjfITmE
https://stackoverflow.blog/2017/02/07/what-programming-languages-weekends/
2017/03/08(水) 06:44:38.74ID:KZ+JXzQR
今更すぎる
和訳で知ったのに原文貼って物知り顔するな
2017/03/08(水) 12:31:57.39ID:RBmx3E25
>>207
週末に人気のあるプログラミング言語(StackOverflow調べ)
https://developers.srad.jp/story/17/02/09/0354232/
週末にいちばん多く使われるプログラミング言語は?
http://postd.cc/what-programming-languages-weekends/
210デフォルトの名無しさん
垢版 |
2017/03/11(土) 21:23:14.84ID:uo9d8gfu
Haskellにも依存型があと数年以内に組み込まれるらしいですが、使用目的は専ら型安全性を得るためなのでしょうか?
2017/03/11(土) 23:30:29.33ID:UHyrmxcZ
定理証明支援系はいつですか?
212resumi
垢版 |
2017/03/12(日) 01:08:56.73ID:f0Kjw9v5
これ普通にショックだね。。
本当なの??
https://goo.gl/RB0asw
2017/03/12(日) 01:54:17.97ID:kqHBJY7y
見てないけどグロ
2017/03/12(日) 22:59:29.77ID:fpOKmvSG
最新のGHCだと余再帰が可能な限り自動で末尾再帰に変換されて最適化がかかるって聞いたんですけど本当すか?
2017/03/13(月) 08:05:36.75ID:0mFH2buk
tanakhに訊け
2017/03/13(月) 10:55:02.44ID:dlgNAjv1
tanakhとかうざ
2017/03/14(火) 22:01:52.58ID:EYcQAf3p
Data.Setをモナドにしたい場合はどうしてますか?
GADTsを使ったものと
https://wiki.cse.unsw.edu.au/cs4181/13s2/Schedule?action=AttachFile&;do=get&target=thum460.pdf
type familyを使ったものと
https://hackage.haskell.org/package/constrained-categories-0.3.0.1/docs/Control-Monad-Constrained.html#g:1
もしくはそれ以外にも方法はあるのでしょうか
2017/03/16(木) 21:36:03.95ID:4z74DpyU
使う型がInt32なら32を、Int64なら64をコンパイル時に決定してソースコードに埋め込むメタプログラミングな関数を書くにはどうしますか?
2017/03/16(木) 22:28:40.43ID:4z74DpyU
Int に 対する read が遅くて困っています。
80万個のInt型をreadするのに、10^9付近の整数ばかりの場合と、1とか10とか小さな整数ばかりの場合とで 2 倍も処理時間が違ってきます。(2秒が4秒です!)
もっと速く読み込む方法はありませんか?
(但し標準入力からとします)
220デフォルトの名無しさん
垢版 |
2017/03/16(木) 23:18:00.86ID:xmljzEMX
readInt
221デフォルトの名無しさん
垢版 |
2017/03/16(木) 23:20:30.52ID:xmljzEMX
ByteStringのreadInt
222デフォルトの名無しさん
垢版 |
2017/03/16(木) 23:21:15.32ID:xmljzEMX
readIntegerだった
うろ覚えだったすまん
2017/03/17(金) 00:45:32.34ID:gNJfFjGV
http://melpon.org/wandbox/permlink/Uii2xmdQFxxnwLS4
2017/03/17(金) 00:46:54.92ID:gNJfFjGV
これは全然メタじゃない
2017/03/18(土) 18:18:35.73ID:bH58Sv6/
>>221
ありがとうございます。10倍速く動くようになりました
2017/03/18(土) 19:37:41.00ID:bH58Sv6/
ひょっとして、foldl か foldl' かよりも、そこに渡す二項関数の方を正格にするか遅延のまま
かが速度に関わっているのでしょうか?

※二項関数は(+)やmaxのように単純であるとする
2017/03/19(日) 04:00:42.66ID:o/zGHEH2
ん、何言ってんだ。二項関数の問題じゃなくて二項関数に渡す『二つの引数が今すぐどちらも値まで評価されるかどうか』が問題なのか。
される場合、foldl'の方がサンクなしの省メモリ(定数空間?)で処理が進むのか。
foldl'で正格に評価するといってもWHNFで止まるんですもんね

サンクが要らないからその部分(サンクの作成と破棄)のオーバーヘッドがなくなってちょっとだけ速くなるのか。でもあくまで foldl' の利点は省メモリの方か
2017/03/19(日) 10:06:06.54ID:awlj00/Y
https://github.com/google/codeworld
http://code.world/

これに関する質問ってこのスレでいいの?
2017/03/19(日) 10:30:10.95ID:fNC16+Hl
速度の比較をしたいならまずプロファイルを取りなさい
2017/03/19(日) 14:43:43.30ID:qjqnp6Y8
V8エンジンで無茶苦茶速くなったことだし、もうTypeScriptでいいやと思うようになった。
231デフォルトの名無しさん
垢版 |
2017/03/20(月) 20:37:53.08ID:H6ds3WUf
教えてください

何らかの型の巨大データがメモリ内にあったとして、データが用済みになった時に手動で解放する方法がHaskellにありますか?

そもそもそういう発想が間違いかも?
2017/03/20(月) 22:25:28.88ID:THpWaU1J
mark&sweepいらないなと思った時に参照カウントに変更する方法
言語を変えなくてもコンパイラを変えるだけでできそう(できたとは言ってない)
2017/03/20(月) 22:42:41.03ID:tOiVLltG
>>231
用済みになった時に手動で解放というのが、

1) たとえどこかから参照されていようが強制的に解放する
2) 参照がなく解放できる時にスケジューリングを待たずにGCを強制する

どちらの意味なのか分からん。

前者のつもりなら、たしか方法はなかったような気がする。
この発想は間違っていると思う。
自分が仕込んだメモリリークの問題を隠しているだけ。

後者なら、base パッケージの Systwm.Mem モジュールを調べてみて。
これなら分かる。
例えばゲームで、できるだけステージ途中で時間かかかるGCが起動しないように、
ステージ開始直前に強制的にGCさせたい、とか。
234デフォルトの名無しさん
垢版 |
2017/03/20(月) 22:58:59.79ID:H6ds3WUf
>>233
ありがとう。質問してよかった。

こちらのイメージ的にはCで言うところのfreeで1)が近いと思うが、GCを強制する
発想がそもそもなかったです

断続的にでかいデータを扱うので、次のロードまでにメモリを解放しておく必要
がありまして。

Systwm.Memを調べてみます。
235デフォルトの名無しさん
垢版 |
2017/03/21(火) 07:16:46.72ID:RPjo5BAn
演算子の部分適用の書き方で
演算子との間にスペースを書かないのはHaskellの作法?
(+ 3) (3 +) じゃなく (+3) (3+) って書くじゃんみんな
2017/03/21(火) 09:36:45.55ID:bH1u/9cj
みんなそうしてるから真似してそうしてるだけだろ。
わからないことは調べるのはめんどくさいから真似しておこうとか思ってそう。
2017/03/21(火) 13:49:23.04ID:L0SduR/f
>>235
普通に2項演算子として用いている場合は項と演算子とが独立してる感があるが、
部分適用した場合は「3を加える関数」という一塊の概念というイメージが強い
なんとなくだけどそんな使い分けではないかと思ってる
2017/03/21(火) 13:55:43.06ID:TPAad80u
GUIには等幅ではないフォントがあるから
1ピクセル単位でスペースを描く作法とかありそう
2017/03/21(火) 14:18:51.18ID:kbUhzU5T
Lispの関数 1+ とかの影響でない?
2017/03/21(火) 14:46:18.79ID:LpaugWCV
逆にHaskellでだけスペース挟んだりしたくないだろ
2017/03/21(火) 19:57:22.30ID:zopuGVTD
人間は文章を読むのに時間がかかる筈なので、質問と同時にGCを強制発動して、ユーザが質問を理解し返答を入力するまでの間にGCを終えたい
242デフォルトの名無しさん
垢版 |
2017/04/02(日) 18:01:47.89ID:HoO7tpUE
「関数プログラミングの思考法」で勉強してるんですが
「たのしく学ぼう!」は楽しく理解できる内容で
こちらは余計な表現は省いている硬派な文体ですね。
そのため反ってサクサク理解していけるのですが
皆さんどうでしょうか。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況