関数型プログラミング言語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/01/29(日) 08:43:35.35ID:INpmjvgO
>>91
path パッケージのラッパーになってる path-io パッケージは良さそうなんだが、
path の方がそんなんでは、どうもな・・・

アドバイスありがと、止めておくよ。
2017/01/29(日) 08:52:55.32ID:W0xWcefq
foldrと同じ働きの関数foldr'は

foldr' :: (a -> b -> b) -> b -> [a] -> b
foldr' f v [] = v
foldr' f v (x:xs) = f x (myFoldr f v xs)

で定義できますが、:tで調べるとPreludeのfoldrの型は

foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b

になってます。
foldr'の型宣言を同様に修正するとエラーが出ます。
エラーが出なくするために二行目の空リスト[]を
どう修正したら良いのか分からんとです。
2017/01/29(日) 08:55:53.89ID:W0xWcefq
訂正
上の myFoldr は foldr' の間違いです。
2017/01/29(日) 09:16:54.72ID:OhLobWwB
これ見るのはダメなん?
https://hackage.haskell.org/package/base-4.6.0.1/docs/src/Data-Foldable.html#foldr
2017/01/29(日) 13:55:23.65ID:/KLkodo+
Foldableは単にfoldr出来ますよーってだけの型クラスだから
リストなどのインスタンスを持ってこないと具体的には定義できない
(==) :: Eq a => a -> a -> Bool
だけでは定義しようがないのと同じ
2017/01/29(日) 15:59:36.88ID:ExFk7aPU
FTPはとっくに取り入れられてた。base 4.8.0から。気付かんかったわ
2017/02/01(水) 13:32:39.96ID:53XrODAY
stackアップデートできねえぞ
atomでエラーでたぞ
ghciってなんでデフォルト一行なの
勉強用なの?ふつうつかわないの?
atomとそのコマンド、パッケージ選び
Gitって初心者なのに入れるの?
ないとターミナルいれられないんだが
ああめんどい
コマンドプロンプト見にくい
フォントきもい
ターミナル必要なのか
ビルゲイツしね
ターミナルってのないとエディタからコンパイルできないの?
コンパイルなし実行できないの?
ライブラリとはなにか、どこにあるのか
アトムから読めんのか
ライブラリよんで勉強するもんなのか
Windowsのディレクトリなにこれ
ユーザー名フォルダの場所とか意味不明
パスってなに、パスの通し方
こんなんググらせんなよ
よくこんなの考えやがったな

やること多すぎ 時間かかりすぎ
おぼえたくない 時間のムダ
技術じゃなくて雑学だな
自動化しとけまとめとけクソクソうんこ
それでもプログラマか
啓蒙する気ゼロだなほんと
2017/02/01(水) 13:51:05.42ID:53XrODAY
オブジェクトファイルとインターフェースファイルのこともちゃんとまえもって教えないとダメでしょ
qiitaとか入門云々とかはてなブログとかほんと死ねばいいのよ
なんでもかんでも初心者にググらせてんじゃないよ!
2017/02/01(水) 16:06:50.00ID:Iw+tyvVU
コンパイラは難しい
昔の古いインタプリタは簡単だった
確率は1/2じゃなくて実際は9割以上が難解な方を選ぶんだろう
2017/02/01(水) 17:56:57.37ID:UXwydrfk
またワードサラダボットが稼働を始めたか
2017/02/01(水) 18:22:05.14ID:C6fGSB5S
初心者じゃなくなってもなんでもかんでもググってる俺
カン拡張って何?ふむふむわからん
2017/02/01(水) 18:27:07.04ID:v0ndbkEe
Kan拡張?
聞いた瞬間分かるわ圏論由来ってwww
圏論の本読め
2017/02/01(水) 19:57:57.60ID:M7LFtYkC
リンシャンカイホウ?
2017/02/01(水) 20:05:04.51ID:Iw+tyvVU
紙の本がなくなったら本を読むのもインストールで挫折する時代が来るかも
2017/02/04(土) 23:20:45.84ID:9/lBQk1n
俺の部屋にはインストールで挫折した本が積み重なっている
2017/02/05(日) 14:17:32.23ID:TDpThq2o
ネタバレはズルという思想があるよね
タダで教えてもらえるネタバレを全部理解してから本を買うという発想ができない
2017/02/05(日) 22:41:58.34ID:TdsB4n5F
FIT(Framework for Integrated Test)
http://fit.c2.com/

これの Haskell 実装にチャレンジしてる人いる?
そんな人のブログやHP知らない?

試しに GitHub を探してみたけど、見当たらない感じ。
2017/02/05(日) 22:42:57.06ID:Whb3/S6q
俺も龍を捨てて玉を詰むという勇気が出ない
2017/02/06(月) 12:52:47.67ID:Ld2MqDtI
Haskell objectiveってどうなったの?
やっぱダメだった?
2017/02/06(月) 14:32:11.26ID:CcXtgB5F
>>110
これか?

https://hackage.haskell.org/package/objective

Haskell objectiveでググると最初に出てくる
2017/02/06(月) 14:44:23.19ID:Ld2MqDtI
使いやすさ的にどうだったのかなって。
作ったの日本人っぽいけど
2017/02/06(月) 15:50:30.09ID:CcXtgB5F
>>111

Haskellでの合成可能なオブジェクトの構成とその応用
https://fumieval.github.io/papers/ja/2015-Haskell-objects.pdf
>この章では、本稿で提案するオブジェクトの定義やその性質について説明する。なお、これから
>示すオブジェクトや関連する構造は、公開している objective パッケージ 1 に格納されている。

> 1 http://hackage.haskell.org/package/objective
2017/02/08(水) 01:03:40.92ID:E7OnquDd
functor分からんとHaskellは使えないの?
2017/02/08(水) 03:27:27.73ID:lPz/aekC
凄いHを一通りやって、今はReal world haskellやってる途中
設計関連がまだよく分かってないな
モナド変換子とか非同期関連もよく分かってないや
関数型の勉強で始めたけど中々難しい
言語としては今の所簡潔で好きではある、ってか他言語の括弧がキモく見えてきた
2017/02/08(水) 09:54:44.42ID:8j/X+nWQ
オフサイドルールには賛否両論ある
2017/02/09(木) 04:29:48.20ID:SonJzAjc
>>114
んな事ない。
と言うか、昔はファンクタ自体無かった。
モナドあるならファンクタも入れろや的な。
モナドも、使うぶんにはいつの間にか使ってる感じ。

モナドとは何か?とか考えると難しいけど、まあモナドもファンクタも型の一種。
そう言う特性の関数や演算子を使うための。
言わば、処理の流れにも型があるとでも思ってくれ。
2017/02/09(木) 08:20:37.05ID:CYxwUQWJ
>>114
実際的に重要なのはFunctorというよりも(そのインターフェースの)fmapの理解かな
多分よく出会うのはListのmapだけど、まずはこいつを使いこなせるようになれば
Haskellらしい、関数型らしい書き方ができるようになってくると思う
119デフォルトの名無しさん
垢版 |
2017/02/09(木) 08:31:16.17ID:/fB7Lbok
fmapとmapの名付けは解せない
2017/02/09(木) 08:58:32.86ID:UTxumv29
モナド則は
型と関数と関数合成が満たすべきルール。
ただし自作モナドがモナド則を満たすことを保証する機構はない。
2017/02/10(金) 15:45:40.33ID:5JASqTbe
fromIntegralに短縮名つけるのが癖の人っている?
fI = fromIntegral 的な
2017/02/10(金) 18:50:22.57ID:xMx0FpSS
長くなるならletで別行で定義する
2017/02/11(土) 23:22:07.65ID:8gjNJV43
メッセージングシステムを主なアーキテクチャとしているアプリケーションにおいて、
そのメッセージの種類を増やすことでアプリケーションの機能を拡張する際に、
コンパイルすべきモジュールの数を最小限に抑える方法を探しています。

メッセージングシステムというと大げさかもしれませんが、
たとえば Win32API のウィンドウメッセージのようなものを想像してください。

モジュールAとモジュールM、およびモジュールTがあるとします。
モジュールTの中ではMsg型が定義されいます。

data Msg = MsgX String Int | MsgY [Double]

また、モジュールTはモジュールAとモジュールMの両方からインポートされています。

モジュールMの関数はモジュールAの関数を呼び、モジュールAの関数は型Msgの値を返します。
モジュールMの関数はMsgXが帰ってきた場合と、MsgYが帰ってきた場合とでその後の処理を変えています。

ここで、このアプリケーション機能を拡張しようと、Msg型にデータコンストラクタMsgZを追加しました。
そして、MsgZを返す関数を持つモジュールBを新たに作りました(もちろんモジュールTをインポートしています)。

ただし、既存のモジュールAは何も変更していません。

しかしそれでも、これをビルドする際にはモジュールAの再コンパイルが必要です。
インポートしている、つまり依存しているモジュールTが更新されたからです。

このような単純なメッセージングシステムの作りだと、どうしてもアプリケーションを拡張する際にモジュールTの更新が伴い、
それによって、変更していない多くのモジュールの再コンパイルが必要になります。

かといって極端な話、メッセージや付随するデータを ByteString 型にシリアライズすれば再コンパイルの問題は解決しますが、
今度は型の不一致や未定義メッセージなどのバグがコンパイル時に発見できなくなり、それもマズいです。

厳格な型システムの恩恵にあずかりながら、かつ不要な再コンパイルを抑えるようなメッセージングシステムの構築方法はないでしょうか。
2017/02/12(日) 13:50:57.94ID:EOfitV0o
javaですら良く分からんやつに
haskellのモナドなど分かるはずも無く
2017/02/12(日) 15:45:54.11ID:+1FsHT8L
ポインタ理解するときもモナド理解するときも小1で自転車補助輪外す時もみんな同じ感覚だった気がする
学習は滴定曲線のように、『気づいたら知って』いた
2017/02/12(日) 16:10:07.24ID:QGOwrBDz
たいていの概念は名前も説明も勿体つけてるが実はたいしたことはない
さらに最悪なのは長々と理屈ついている割に扱いは他の概念と変わらないやつだ
そういうのを世間では屁理屈という
2017/02/12(日) 17:52:39.61ID:C9OkM4dT
西尾維新批判はやめろ
2017/02/12(日) 21:33:24.01ID:hoDvKKnX
アベノミクスとか新常態とかもそうだよね
2017/02/12(日) 22:25:13.91ID:cs8Gyxec
haskellの本が出るみたいだから買ってみよう
2017/02/12(日) 23:59:55.00ID:t7tEKqZ9
>>89の二冊か
131デフォルトの名無しさん
垢版 |
2017/02/14(火) 00:10:05.79ID:haBe4Sdm
お前らってこういうのチェックしてたりするの?

Haskell News
http://haskellnews.org/grouped
2017/02/14(火) 07:07:04.56ID:0/yLOI7Z
そもそもfoldはループより速い?
2017/02/14(火) 10:36:57.61ID:CVjuh2pk
>>132
Haskellにはループ構文はありません。
一体何と比較した話でしょうか?
2017/02/14(火) 16:50:38.39ID:m6BuE6wx
>>133
C
2017/02/14(火) 21:33:40.60ID:jOgsWiWm
>>134
Haskellの中で複数のアルゴリズムの比較はできますが、
C言語のforループとの速度の比較はできません。
2017/02/14(火) 23:12:33.60ID:Bh34MboJ
バイナリを吐かせて逆汗すれば比較できるんでないの?
つっても多くの関数呼び出しはインライン展開されるんだろうが
2017/02/15(水) 05:29:57.20ID:De10g5Ib
>>132
データ構造やコンパイラによる。
Haskellは基本リストなのでアドレスが連続してるとは限らない。
Cだと同じ処理を配列に施す様なループはSIMD命令に変換される。
Haskellはそう言う命令に変換する為のデータ構造使う。
(データの連続性を保証するためにもデータ構造が別なのだと思う)

IntelC++コンパイラとかだと最新のSIMD命令に対応してる。
gcc程度まではHaskellでも書き方次第では追い付けるだろうけど、CPUメーカー謹製の最新CPU対応コンパイラにまでは勝てない。

入門書レベルではHaskellはCに勝てないけど、いかなる並列・並行処理も否定してない。
2017/02/15(水) 06:42:21.88ID:+7DpWr8H
そもそもHaskellのfoldとCのforループとでは、
速度を比較するための条件をそろえる事ができません。

たとえばプロセスを立ち上げてから処理し終えるまでの時間、
このレベルであればHaskellとCの比較に意味はあります。
実行環境という条件を同一にできるからです。
(ちなみに、この場合はCの方をHaskellより速くすることができます)

一方HaskellのfoldとCのforというレベルでは、まず計算するために入力するデータが違います。
foldの入力データ型はリスト(Foldableのインスタンス)ですが、同じものをCで再現できますか?
入力データをそろえなければ「関数程度のレベルの比較」に意味はありません。
2017/02/15(水) 07:03:08.40ID:mu4JLPUi
扱うモナドがファンクタのとき
return . f =<< m

f <$> m
とシンプルに置き換え可能なのですね
2017/02/15(水) 10:15:38.52ID:JnBGC/9x
何年か様子見してたけどやっぱり流行らんな
難しいから底辺には普及しないはわかるが
だったら上位の連中は食いつくかと言えばそんなことはなかった
2017/02/15(水) 11:05:35.10ID:3lGP54OB
難いのに普及したC
2017/02/15(水) 11:41:14.45ID:1S7+uRG8
C以前の言語がひどすぎたんだ
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 したライブラリを使用するには、
どうすればよいのでしょうか。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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