X



関数型プログラミング言語Haskell Part31©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0655デフォルトの名無しさん
垢版 |
2018/07/08(日) 01:32:29.33ID:fmVgo5Ue
>>652
オレ >>651

つまりはn要素のリストのsort後の先頭m要素 (m<n) を評価するのは、
n要素を評価するより少ない計算量で済むんじゃないか、という質問なんだ

だから sort と takeWhile を入れ替えたら意味ない
0656デフォルトの名無しさん
垢版 |
2018/07/08(日) 01:40:40.69ID:fmVgo5Ue
ふと思いついたが、比較関数に unsafePerformIO を入れて比較回数をカウントすれば分かるかも

今は実験環境が無いから、起きたら試してみる
お騒がせしてごめん、という結果になるかも

お休み、お前ら
0657デフォルトの名無しさん
垢版 |
2018/07/08(日) 09:12:56.04ID:fmVgo5Ue
実験したら、やっぱり評価に必要な部分しかソートされなかったよ
実験は takeWhile じゃなく take でやった

[実験コード]
ucomp :: IORef Int -> Int -> Int -> Ordering
ucomp ref x y = unsafePerformIO $ do
modifyIORef ref (+1)
return $ compare x y

main = do
let g = mkStdGen 1
let xs = shuffle' [1..8] 8 g
rc <- newIORef 0
let ys = take 8 $ sortBy (ucomp rc) xs
putStrLn $ show $ maximum ys
c <- readIORef rc
putStrLn $ show c

take で取り出す要素数を8個と3個で実験し、show c の結果を比較
  8個 c=19
3個 c=14

やっぱ遅延評価ってイイね
ベスト3を決めるのに他言語みたいに全部を評価する必要がない

ちなみに、100万個の要素でもやってみた
  all c=19237801
  3個 c=1413225

質問したけど、ひとりで納得してしまった、すまん
0659デフォルトの名無しさん
垢版 |
2018/07/08(日) 10:45:22.88ID:JJmFxw3L
どんな言語だろうが全部ソートすれば O(n*log(n)) で最小値や最大値を探すのは O(n)

この n と n*log(n) の差を無視できないなら
そもそも n と 100*n の差を無視するのもダメじゃないかと思う
0660デフォルトの名無しさん
垢版 |
2018/07/08(日) 11:20:47.41ID:fmVgo5Ue
>>658
いや、そうじゃなくてさ

上位m個の選択処理とソート処理とをソース上ではきっちり分けてるじゃん
ソースを読む人間にとってはすげー読みやすいわけよ

なのに内部処理的には2つが連携して、
必要なところまでしかソートされないだろ
選択処理のためにワザワザ特殊なソート処理をしなくてもさ

そこがすげーって感動してるんだよ
0661デフォルトの名無しさん
垢版 |
2018/07/08(日) 11:30:44.71ID:Xnl3te8c
まあソートなんて如何にもキャッシュ次第なアルゴリズムで
連結リストと遅延評価のO(N)が配列と正格評価のO(NlogN)に
現実的なNの範囲で勝てるのかものかどうか・・・
0662デフォルトの名無しさん
垢版 |
2018/07/08(日) 13:00:05.06ID:MJ8iSrG7
まるで永久機関の話を見ているようだ
0663デフォルトの名無しさん
垢版 |
2018/07/08(日) 22:57:14.98ID:wt6yCeB5
具体例や比喩で抽象度を下げるのは良い
だが「永久機関っぽいもの」の集合を作ったらむしろ抽象度が上がり収拾がつかなくなる
0667デフォルトの名無しさん
垢版 |
2018/07/14(土) 09:44:23.46ID:sMbeASmt
yampaムズ過ぎ

初心者用のシンプルで教育的なチュートリアルって無いの?
英語でもいいから教えて
0669デフォルトの名無しさん
垢版 |
2018/07/15(日) 05:50:15.76ID:uHtx5/Ti
>>668
申し訳ない

そこは、FRPの基礎概念である「ビヘイビアとイベント」と、
Yampaの基礎概念である「シグナル関数」との繋がりが言葉で説明されていないんだ

コードを書きまくって慣れろ、って感じ
0673デフォルトの名無しさん
垢版 |
2018/07/27(金) 11:27:32.40ID:qBTTu3Zk
importのhidingとかqualifiedとか適当にやってるせいで、いつも収拾がつかなくなってる。

ブラックリストかホワイトリストか、asで名前付けるのはどんな時か。みんなどうしてるの?
0674デフォルトの名無しさん
垢版 |
2018/07/27(金) 21:52:57.03ID:lmpcLfYu
>>673
私も知りたいな。

私の場合は、頻繁に使うもの以外は、
qualified as してる。

そして、asでつける名前にいつも悩む。
0675デフォルトの名無しさん
垢版 |
2018/07/29(日) 20:22:22.75ID:tC3jGbCj
インポートリストをざっと見ることで、モジュールの役目が何となく掴めて嬉しい。たとえば
import Data.Text.Lazy
import Text.Parsec
だったら、ああなんかをパーズするんだな、と分かる。

一方、
import Math (sin,cos,tan)
みたいになっていても、このモジュールは三角関数を使うやつ、ということは判るが、それが大して役に立つとは思えない。

だから値の明示的インポートはやめて、hidingだけに統一しようかな、と考えてる。
値がバッティングして、かつ両方使いたいならそのモジュールは qualified する。
0676デフォルトの名無しさん
垢版 |
2018/07/29(日) 20:25:02.63ID:tC3jGbCj
>>674
基本大文字を拾って as している。
import qualified Data.Map as M
import qualified Data.Set as S
だが
import qualified Text.Regex.TDFA as TDFA
つらい
0684デフォルトの名無しさん
垢版 |
2018/08/12(日) 18:12:55.83ID:HMPSYWub
新分子設計は並列処理を酷使するだろうが
強化プラスチックが特別どうということはないだろう
0687デフォルトの名無しさん
垢版 |
2018/08/13(月) 06:20:04.15ID:HYnqBmQs
いいねえ。気軽に使えるからコマンドラインは好き。
自分で使うツールを作るのが一番モチベ上がるね
0688デフォルトの名無しさん
垢版 |
2018/08/13(月) 14:03:54.60ID:DTF7R3qv
Get Programming with Haskellはタイトルのとおり初心者向けの本だよ
600ページの本で400ページ超えたところでstack導入して、
あとは、簡単なコマンドラインツール、http、JSON、dbおさわりくらい
それまでは、ghci使ってhaskellの学習
0690デフォルトの名無しさん
垢版 |
2018/08/27(月) 22:15:37.17ID:8S3lymML
今やすいぞ 多分半額程度

ソフトウェアシステムアーキテクチャ構築の原理 第2版
https://www.amazon.co.jp/ソフトウェアシステムアーキテクチャ構築の原理-第2版-ニック-ロザンスキ-ebook/dp/B00ZF44J0I/ref=tmm_kin_title_0?_encoding=UTF8&qid=1535375513&sr=1-1
0692デフォルトの名無しさん
垢版 |
2018/09/04(火) 09:34:44.70ID:0nZVvdsT
カリー化された関数の表記がよく分かりません。

add' :: Int -> (Int -> Int)
add' x y = x + y

↑これはどうやって解釈すればいいのでしょうか?
add' は関数を返す関数であるにもかかわらず、 = x + y となっているので数を返す関数のように見えます。

↓このλ式を使った表記は何の問題もないと思います。

add = \x -> (\y -> x + y)
0693デフォルトの名無しさん
垢版 |
2018/09/04(火) 09:40:03.69ID:0nZVvdsT
add x = \y -> x + y

これでも問題ないと思います。
0694デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:34:46.73ID:ntR3woJY
Int -> (Int -> Int) も
Int -> Int -> Int も同じやろ

add 1 2 としたらIntになるし
add 1 としたらInt -> Intの関数が得られる
それだけ

更に引数3つとるaddなら
add = \x -> (\y -> (\z -> x + y + z))
と同じ意味だし、haskellはデフォでそういう仕組になってるってことやろ
0695デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:40:17.26ID:0nZVvdsT
>>694

ありがとうございます。

add' :: Int -> (Int -> Int)
add' x y = x + y

↑この表記って、よくない表記じゃないですか?

add' x y = x + y

↑これをみて、型が add' :: Int -> (Int -> Int) だとはとても分かりません。
0697デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:48:48.98ID:ntR3woJY
逆にそれ見たらどういう型だと思った?
Int -> Int -> Int
って思ったんじゃない?

なんの本読んでるかしらんけど
例えば add x y z なら Int -> Int -> Int -> Int だけど
実際には
Int -> (Int -> (Int -> Int))
こうなってるってことを言いたいんやろ
0698デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:50:47.26ID:0nZVvdsT
>>696

add' :: Int Int -> Int

という型に見えます。
0699デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:52:13.57ID:0nZVvdsT
1 2

のように整数をスペース区切りで二つ並べたものに対して、

1 + 2

を対応させる関数に見えます。
0700デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:54:55.24ID:0nZVvdsT
関数を返す関数なんですから、

=

の右には数ではなく関数を書くべきです。
0701デフォルトの名無しさん
垢版 |
2018/09/04(火) 10:57:59.07ID:0nZVvdsT
f x = x + 2

などの例を見て、

f ● = ■

という表記は、

f(●) = ■

という意味かと思います。
0702デフォルトの名無しさん
垢版 |
2018/09/04(火) 11:29:45.35ID:ntR3woJY
add は関数を返す関数じゃなくて引数を2つとって値を返す関数やろ
そこでもう勘違いしとる
add 2 3 の結果は関数じゃなくて値やろ?
add 2 のように引数を一個だけ渡したら部分適用されて引数を一個とる関数が返るってだけや

haskellはそういう部分適用できる関数を書きやすいように
add x y = x + y を add = \x -> (\y -> x + y)に自動で変換してくれるってだけ
糖衣構文ってやつ
嫌なら全部ラムダ式で書けばいいよ
0704デフォルトの名無しさん
垢版 |
2018/09/04(火) 12:05:07.87ID:/45N32wx
**argv :: char
*argv :: char*
argv :: char**

add' x y :: Int
add' x :: a -> Int
add' :: b -> a -> Int

C言語を学習した人はHaskellも分かる
これが知能だ
0705デフォルトの名無しさん
垢版 |
2018/09/04(火) 12:52:41.14ID:JkSql3w1
Haxe では関数の型は、
function sum (a:Int, b:Int) : Int

Int -> Int -> Int
引数1 -> 引数2 -> 戻り値

最後は戻り値
0706デフォルトの名無しさん
垢版 |
2018/09/04(火) 12:54:41.46ID:tHCjwI0T
>>701
Haskellは関数適用が最優先だから
add' x y は (add' x) y って意味
だから add' x y = x + y は
「add' にxを適用した結果にyを適用した結果はx+yに等しい」と読める

ちなみに組み込み関数のuncurryを用いて add'' = uncurry add' とでも定義すると
add'' :: (Int, Int) -> Int
というおそらく>>698 でイメージしているであろうものに近い関数が得られる
Haskellのデフォルトの振る舞いはこちらではないという話
0708デフォルトの名無しさん
垢版 |
2018/09/04(火) 20:06:44.00ID:f+p4hPZb
Haskellちょっといじってると楽しいけどこれで飯食うのは自分には絶対無理という確信がある
0713デフォルトの名無しさん
垢版 |
2018/09/05(水) 02:54:04.71ID:MYQmiXId
写像をドメイン、コドメインのみ与えて定義するのが簡単にできればちょっと優位にたてる分野はある
0715デフォルトの名無しさん
垢版 |
2018/09/05(水) 17:04:52.63ID:7oDYcpPT
いまのHaskellには何が足らないのか。どんな分野で強みが活きるのか
0717デフォルトの名無しさん
垢版 |
2018/09/07(金) 12:23:22.72ID:bXCAi+24
DDDが活きてくる(と見込める)ほどの規模の案件をhaskellで組むプロジェクトって凄いな

本格的にhaskellを導入してるんだね
0721デフォルトの名無しさん
垢版 |
2018/09/08(土) 00:07:42.03ID:8HsWZyyw
コンセプトは無茶苦茶面白いのに、肝心の実装が学級的で好き放題に流動的で恐ろしく無責任だからでは
0722デフォルトの名無しさん
垢版 |
2018/09/08(土) 13:16:38.32ID:kGQ5zdyq
>>721
そうなのか。具体的にはどのあたりが?
0725デフォルトの名無しさん
垢版 |
2018/09/11(火) 20:55:06.43ID:GxY7LXz/
ひゃっほおおおう! ビルド通ったぜ
stackageの可能な限り全部の総計2352パッケージを含むプロジェクトのビルドがやっと通った。
もはや ghci をいったん落として stack.yaml と cabal ファイルにパッケージを追記し... などという面倒をしなくても
ただ import するだけでそれが利用可能になる。
0726デフォルトの名無しさん
垢版 |
2018/09/15(土) 18:42:49.12ID:UVc1X0kV
spacemacsのinteroでデバッグできてる人います?

replを立ち上げた後、デバッグしようとする(spc m d d)と、
No Haskell session associated with this debug buffer.
てエラーが出て、先に進まないです。
上記はhaskell-debug.elの中に出てくるエラー文で、
上で立ち上げたrepl(stack ghci)がsessionとして認識されてないのが原因?な気がしますが、力及ばずって感じです。
0727デフォルトの名無しさん
垢版 |
2018/09/16(日) 08:20:46.91ID:qJ8HI8bW
>>712
金融で使ってる。
あと文書解析。
0728デフォルトの名無しさん
垢版 |
2018/09/16(日) 22:36:53.37ID:/Gv7qrCh
すみません言語の話題から少し外れますが、

Windows10環境で
WinGHCiコンソール(ver 1.0.6)を使っているのですが
表示フォントをコンソラス等にしても
滑らかな文字表示がされず
メモ帳エディタの様な細いジャギー文字表示になります。

何か環境を弄ったり外部設定ファイルを書き換えたりして
外国のユーザー画面みたいな滑らか文字表示にする方法を
もしご存知でしたら教えて下さい。
0729デフォルトの名無しさん
垢版 |
2018/09/17(月) 17:50:28.07ID:tAsBi2aZ
ポールフダックの音楽/Haskellの本が延期しまくりでつらみ
慰めに手を出してみたreact+reduxが割と面白くてjavascriptおじさんになりそう
0730デフォルトの名無しさん
垢版 |
2018/09/18(火) 15:50:49.67ID:zscrEVSG
ハスケルミュージックスクールってやつ
なら無料で読めるドラフトバージョンのやつよんだけど糞つまらんよ
ほとんどがライブラリーの使い方の説明しか書いてない
0731デフォルトの名無しさん
垢版 |
2018/09/18(火) 23:03:29.52ID:5HE01N22
その本です
定価で買うような本じゃなさそうですね…
0732デフォルトの名無しさん
垢版 |
2018/09/18(火) 23:04:16.22ID:5HE01N22
遅れましたがありがとう。
0733デフォルトの名無しさん
垢版 |
2018/09/19(水) 23:56:22.00ID:Pb0Tb1M0
木構造を表現するときの、「節」とか「葉」って、どう読みますか?
0734デフォルトの名無しさん
垢版 |
2018/09/20(木) 12:01:53.37ID:7WHuQIEO
ふし
よう
0742デフォルトの名無しさん
垢版 |
2018/09/20(木) 22:11:42.05ID:92zkwrbu
733です
ありがとうございます

「き」「…」「は」で、「節」の読みを決めかねていましたが、>>736さんの仰るとおり、「ふし」で行くことにします
0743デフォルトの名無しさん
垢版 |
2018/09/20(木) 22:24:45.13ID:92zkwrbu
すみません、733です

音訓(違うかな?)いずれかに寄せるべきと感じていたからです

他の方々もありがとうございました
0745デフォルトの名無しさん
垢版 |
2018/09/21(金) 11:17:49.00ID:pJEikkxu
メモ化とスペースリークが本質的に同じもので、
言わば発酵と腐敗の関係の様なものだと知ったときは感動した。
0747デフォルトの名無しさん
垢版 |
2018/09/22(土) 03:54:02.44ID:iTw0SS1T
>>744
path でええやん
0748デフォルトの名無しさん
垢版 |
2018/09/22(土) 05:09:30.37ID:1NyjNSxI
>>747
元の英語がpath, trail, walkとか分かれてるのだが

文学なら訳し分けにくい概念は思い切って意訳することもできるが
技術用語だとそうもいかないのが難しいところ
0749デフォルトの名無しさん
垢版 |
2018/09/23(日) 15:45:23.97ID:f8u3bg2b
Coerce知らなかった。newtypeを自動で剥がしてくれる便利なやつ

import Data.Semigroup
import Control.Arrow
import Data.Coerce
aggregate :: [Int] -> (Maybe Int,Int)
aggregate' :: [Int] -> (Maybe Int,Int)

aggregate = (fmap getMax *** getSum) . foldMap (Just . Max &&& Sum)
aggregate' = coerce . foldMap (Just . Max &&& Sum)

https://speakerdeck.com/konn/ben-dang-hasugoi-newtype
0750デフォルトの名無しさん
垢版 |
2018/09/30(日) 08:19:13.93ID:0APHfRwQ
リストの要素がすべて異なる場合はTrue、
一つでも同じものがあれば False を返す関数を作りたい。

私が思いつく限りでは、次の方法が効率的には最適解だと思うのだが、どうだろうか。

リストが Eq と Ord のインスタンスであるという制限をかけた上で、
まずリストをソートし、それから隣の要素同士で同値関係を調べる。

ちなみに、これは○○問題などと名前がついているのだろうか。
0751デフォルトの名無しさん
垢版 |
2018/09/30(日) 14:27:30.56ID:3FJv0aaM
名前をつけるとしたらグラフ○○かな
グラフ簡約のように木をグラフに変える問題
0753デフォルトの名無しさん
垢版 |
2018/09/30(日) 14:56:02.92ID:HUnS5YBa
ソートは不要だし、どの言語でもdictionary/mappingにして要素数見るだけの作業のような
■ このスレッドは過去ログ倉庫に格納されています

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