関数型プログラミング言語Haskell Part33

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/02/10(月) 18:17:36.49ID:L6eYQqyh
関数型プログラミング言語 Haskell について語るスレです。

Haskell Language(公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ - Haskell-jp
https://haskell.jp/

前スレ
関数型プログラミング言語Haskell Part32
https://mevius.5ch.net/test/read.cgi/tech/1548720347/
2021/03/18(木) 15:12:33.23ID:4AdjqCpZ
なんか最近プログラミングの情報ネットで漁ってると数学基礎論の記号らしきもの、横棒の上になんか命題らしき文字列が並んでる奴がめちゃめちゃ出てくるんですけど、完全に乗り遅れました
なんかあの記号の意味解説してるいい教科書とかサイトとかありませんか?
2021/03/18(木) 19:10:51.45ID:lKavXNN6
>>761
このような式ですか?

P -> Q P
--------------
Q

これは、横線の上の論理式(この例の場合は2つの論理式)を前提とすると、
いくつかの推論規則を使えば横線の下の論理式が導ける、
という意味です。

論理学の教科書(的な解説サイト)ならレベルの高低に関わらずどれでも載っていますが、
どれでも式自体の意味についてはこの程度の説明しか無いと思いますよ。
例えば
https://abelard.flet.keio.ac.jp/person/takemura/class/2013/3-print-nk.pdf

知りたいことが違っていたらごめんなさい。
2021/03/18(木) 19:28:09.20ID:wWeTTUcP
>>762
ありがとうございます
ギリギリその図形の意味はわかります
問題はそれとプログラミングの理論がどう関わってるかのとこなんです
多分カリーハワード対応というやつだと思うんですが
コレなんか役に立つもんなんですかねぇ?
2021/03/18(木) 20:21:41.37ID:lKavXNN6
>>763
めちゃめちゃ出てくるという事ですので、
そのページのURLをいくつか挙げてくれませんか。

そうすれば、もしかしたら、どう関わっているの把握できて、
説明、あるいは解説ページや書籍の紹介ができるかもしれません。
2021/03/18(木) 20:27:07.75ID:gebFut6o
例えばプログラムをリファクタリングするとき、修正前後での挙動一致を証明できたりするぞ
すごい🤗
(依存型のないHaskellでは出来ないからidrisの例だけど)

https://keens.github.io/blog/2020/12/22/idrisdeizongatawotsukattashoumeinyuumon/

やりたいことが数学/論理学の勉強とかならcoqのほうがよさげ
2021/03/18(木) 23:49:21.36ID:wWeTTUcP
>>764
そうですね
例えばcall by nameとcall by needの違いを調べようと思った時に出てきた

https://reader.elsevier.com/reader/sd/pii/S1571066104000222?token=1C1ACCAE69D33669B7D36179C932FC14DD80723B2FD5B3080E3B1EDED9228FC6A9A6AC347668843625B7154C276B7B4C

なんかバリバリ出てきます
なんのこっちゃと

>>165
coqもよく聞きますよね
なんかおすすめの教科書とかありますか?
2021/03/19(金) 00:48:13.30ID:H+hZ3f68
カリーハワード対応って要は
True => True = True
True => False = False
False => True = True
False => False = True

{単集合->単集合}=単集合 (単集合から単集合への写像は一通りだけ)
{単集合->空集合}=空集合 (単集合から空集合への写像は存在しない)
{空集合->単集合}=単集合 (空集合から任意の集合への写像は一通り(空写像))
{空集合->空集合}=単集合 (上に同じ)
と対応してるって感じと捉えれば良いのかな?
wikipedia読んでもあんまり理解できない
2021/03/19(金) 01:58:47.96ID:MuA020tT
名前呼び出しの意味が分かりません
2021/03/19(金) 02:07:37.96ID:FHn+Zz2I
>>766
結局のところ知りたいことは何ですか?

カリーハワード同型対応とプログラムとの関係性ですか?
それとも、カリーハワード同型対応がプログラムの何に役立つのかですか?
それとも、call by name と call by need との違いですか。
それとも、その論文の内容ですか。
(その場合、PDFの5ページ目まで、つまり横線の式が登場する部分まではちゃんと理解できていると思っていいのですか?)

それとも、全く別のことですか?

とりあえず知りたいことをピンポイントに小さく一つに絞り、
それを具体的に質問していただけると助かります。


ところで、>>768 は元の質問者さんですか?
770768
垢版 |
2021/03/19(金) 02:15:59.36ID:MuA020tT
>>769
ごめんなさい
僕は別人で割り込みです
2021/03/19(金) 03:08:33.55ID:FHn+Zz2I
>>770
遅延評価を実現する評価戦略の中に、必要呼び出し(call by need)と名前呼び出し(call by name)があります。

必要呼び出しはhaskellが採っている戦略で、
一度評価した値を使い回して無駄な呼び出しを防ぐものです。

一方、名前呼び出しは同じ遅延評価でも、評価した値を記憶せず、必要なら何度でも同じ評価処理をするものです。
2021/03/19(金) 09:49:18.16ID:pEtEADGt
>>769
そうですね
多分対応自体はわかると思います
しかし実際カリーハワード対応で基礎論の世界に持って行くことの効用がよくわかりません
基礎論の世界に持っていって基礎論でよく知られたなんかの定理が使えるとかいうわけでもなさそうですし
最初はcall by needの実装の話、すなわちcall by needでは展開された評価式に同じexpressionが出たとき、その内容を保持して同じ評価を何度も繰り返すのを防ぐらしいですが、もちろんどんな評価でも何でもかんでもメモするわけではないようなので、結局自分で手前でメモ化する必要がでたりします
どういう時はcall by needのメモ化が効いてどういう場合は効かないのかよくわからないので現状は“やってみる”しかないし、やってみて上手くいかなくても、なんか上手い書き方すればやってくれるのか、はなからだめなのか、その判別もつきません
773768
垢版 |
2021/03/19(金) 11:58:13.56ID:f7aaFMxN
>>771
ありがとうございます

このときの「名前」なのですが、識別子のようなものでなく、評価・簡約前の「式の字面」的な意味なのですかね
2021/03/19(金) 13:27:51.17ID:5FIf9nG9
静的型のアイデアは
実行時の世界でやっていたことをコンパイル時の世界に持って行くことだから
このアイデアが常識にならない限り動的型の時代は終わらないだろう
2021/03/20(土) 08:58:16.14ID:Hmrg9tvu
>>772
プログラムの世界において、ある事柄の性質や、事柄Aと事柄Bの間の関係を調べたいとき、
プログラムの世界の中ではなかなかうまく見えてこない場合がある。
そんなとき、 カリーハワード同型対応によって問題を論理の世界に移すと、
見通しが良くなり、調べやすくなることがある。
そういう意味では役立ちます。
質問者さんが例示した論文がまさにそれです。

一方、何かを作るためにプログラムをする(現場の)人たちにとっては、とくに役立つことは無いと思います。
役立った話を一切聞きません。

質問者さんが、名前呼び出しなどの「性質や関係」を学術的に深く知りたくて調べているのであれば、役立つと思います。

自作のプログラム言語で名前呼び出しを実装したくて調べているのであれば、役立ちませんね。
別の論文に当たった方がいいと思います。
2021/03/20(土) 09:35:36.64ID:IEpiSEKy
>>775
そうなんですか
難しいですね
haskell の call by need のシステムがどういう具合に実装されてるか調べようとするとほぼ確実にカリーハワード対応が出てきます
ボチボチ勉強するしかなさそうですね
そもそもcall by needのメモ化の話はhaskell コンパイラの実装の話なのでhaskellの言語自体のレギュレーションにはひとつも載ってない(つまりghcではメモ化が効いて早いけど別のシステムでは遅いという事もありうるし文句言えない)ので効くか効かないか試してみるしかないのが不愉快なんですよねえ
2021/03/20(土) 10:00:16.31ID:1F8CRKpv
>>776
それなら graph reduction の実装を調べた方が良いと思います。
2021/03/20(土) 10:28:51.32ID:Hmrg9tvu
>>773
すいません、call by name という名称の由来は分からないです。
いままで気にしたこともなかったです。
779768
垢版 |
2021/03/20(土) 12:05:15.57ID:WUxvQvbt
>>778
ありがとうございます
こちらこそ、たびたびすみません

マンガのセリフのことを「ネーム」というらしいので、書いた字面をいうのかなと考えたり
name を和英・英英辞典で調べても、結局しっくりきませんでした

スレ汚しすみませんでした
2021/03/20(土) 14:58:31.86ID:5ytd1i+3
カリーハワード同型対応とかって、機械学習だのアーキテクチャだのネットワークだのアルゴリズムだのといった工学的で応用的で目的意識の定まった何かの役に立つために発明されたものというよりも、理学的で基礎的な単なる重要な事実という雰囲気ある気がする
2021/03/21(日) 00:15:43.04ID:5CEWIvha
貴金属と期限つきポイントの対立煽りにたとえる
使用期限がないのは使用目的がないと言っているようなもの
だが期限がない方もメリットがあるのは工学的にも否定できない事実
2021/03/22(月) 13:52:42.80ID:gNDsQT3i
>>777
graph refuctionですか
調べてみます
しかしともかく、じゃあGHCとかではどう実装されてるのかとかいう資料はかなりの割合で結局カリーハワード対応使ってる文献しか出てこないのがなんとも
当面は“やってみる”でやり過ごすしかなさそうです
2021/03/22(月) 15:09:38.98ID:UycYSiaC
call by name(仮)の正式名称がgraph reductionだったら
カリーハワード対応(仮)にも正式名称がありそうだけど
訂正することで利益が出せるようにならなければ正式名称の価値も分からん
2021/03/22(月) 19:37:04.72ID:TV/B7jf8
>>782
私にはむしろカリーハワード同型対応を陽には使っていない資料しか見当たらないです。
検索キーワードや調べ方が違うのかもしれませんね。
(カリーハワード同型対応がさす意味がお互いに違っている可能性もありますが)

この資料はどうでしょうか。
遅延評価をする関数型言語一般の実装方法です。
https://www.microsoft.com/en-us/research/uploads/prod/1987/01/slpj-book-1987.pdf
2021/03/22(月) 20:29:59.10ID:UycYSiaC
例えばmonomorphism restrictionとかいうアレだったら
実行時の挙動ではなく型の話になるんじゃないか
2021/03/23(火) 01:01:29.12ID:HzbeYy7B
>>784
ありがとうございます
十章ですね
今度時間を見つけて読んでみます
そうですね
やっぱり私はGHC関連の資料をあたる事が多くて、やはりそこでは数学よりの資料が多いんでしょうね
でもやはりcall by needの実装方法はHaskellのレギュレーションには含まれていない実装依存のところなのでGHC userの私はどうしてもGHC関連の資料から当たりたくなってしまいます
GHCでのインプリメントは最新の成果が全て反映されてるとは限らないし、あるいはあまり一般的でない手法を用いているかもしれないし、そこはGHCそのものの資料が一番頼りになります
ただ一つの問題はあまりにも数学村(の計算論畑)の言葉で書かれててサッパリわからんとこorz
2021/03/23(火) 03:42:25.12ID:VKgh9sH5
>>786
余計なお世話だとは思いますが、どの章もその前までの章の積み重ねなので、
第10章だけを読んで理解するのは難しいと思います。

かなり古い資料を提示したのは、基礎の基礎から学んだ方が良いと思ったからです。
この資料は本当に分かりやすく基礎から説明されているので、
急がば回れの精神で、腰を据えてじっくりと学んでみることをお勧めします。
それこそ数ヶ月かけて。


なんかこう、数学で例えるなら、集合論や解析学の基礎があやふやなまま、
位相空間論の必要な部分だけを都合よく学ぼうとしているような、
そんなきらいがあるように見えます。
2021/03/23(火) 05:16:41.87ID:EMfQwUjX
そうですか
残念ながら当方計算論はウルマンホップクラフトや西岡先生の教科書しか読んだことないのでかなり知識が数学サイドに寄ってます
仕事もかなり数学よりで計算論はあくまで趣味なのであまり本腰入れて勉強したことはないのでもしかしたら専門に勉強されてる方から見ればそうかもしれません
まぁ本職に悪影響与えない範囲で時間見つけてボチボチ勉強します
2021/03/23(火) 07:32:33.02ID:e41TIwig
はっきり言うと評価戦略だとか推論規則だとかカリーハワード同型対応だとかの話は、まともな情報系の学部なら習う基礎基本
大学の講義資料が易しいと思われ
2021/03/23(火) 20:57:46.65ID:zFHE0Fu5
情報系とかいう言い方をする奴は言語から逃げてるね
「数学村の言葉で書かれ」た資料が存在するのも
C言語で書かれたOSの話をしないのも
言語から逃げた結果じゃないかな
2021/03/24(水) 19:34:45.53ID:8SYKHDut
何言ってんだコイツ…
2021/03/26(金) 00:15:16.59ID:sjuSPGcx
カリー・ハワード同型対応はこのスライドが分かり易かった
結局なんで上手く行くのかって良く分かってないのね
https://ocw.kyoto-u.ac.jp/ja/faculty-of-lettersja/002-006/pdf/curryhoward.pdf
https://ocw.kyoto-u.ac.jp/ja/faculty-of-lettersja/002-006/pdf/curryhoward2.pdf
2021/04/05(月) 18:23:16.33
関数の名前が被るとき、このモジュールのそれだと修飾しますが、
今書いてる翻訳単位のそれだと伝えるには今書いてるモジュール名で修飾するしかないのですか?
それが長大な場合惨めな気持ちになります

qualified 今書いているモジュール名 as 短い名前
にするような事はできないのですか?
2021/04/05(月) 21:28:27.96ID:DOv0Oh8v
idrisを使った型駆動設計の話を聞いて、凄いなぁと思いました。
でもこの型駆動設計って、依存型が開発言語のあるのが前提の方法なんでしょうか?
2021/04/05(月) 22:48:33.31ID:RKVG1ya/
>>793
今書いている翻訳単位で import しているモジュールを qualified で装飾すれば、
今書いている翻訳単位内で定義している同名の関数は修飾せずとも使えると思うのですが、どうですか?

module Main where

import qualifued Data.List as L

transpose :: (Int, Int) -> (Int, Int)
transpose (x, y) = (y, x)

main :: IO ()
main = do
let a = L.transpose [[1, 2], [3, 4]]
let b = transpose (1, 2)
putStrLn $ show a ++ " / " ++ show b
2021/04/06(火) 12:32:00.21
>>795
値コンストラクタ名に被りがあった場合、それができないようなのです
import モジュールの側の同名値コンストラクタを、qualifiedして修飾しましたので今書いてるモジュールの方を修飾なしで書いたのですが
それはAmbiguousだと怒られます
2021/04/06(火) 20:13:47.61ID:sYlI8eNJ
ホントだ
怒られた

import qualified Data.Bool as B

data MyBool = True | False

instance Show MyBool where
show Main.True = "MyTrue"
show Main.False = "MyFalse"

main = do
print B.True
print Main.True
--print True ←ダメだって
2021/04/06(火) 20:14:29.60ID:VZ4U19ap
そりゃそうでしょうよ・・
2021/04/06(火) 20:30:15.84ID:O0PfwEM6
曖昧さ無く無い?なんでダメなんだっけ
2021/04/06(火) 20:31:09.67ID:xR67cG4d
Prelude が暗黙的に居るから?
2021/04/06(火) 21:08:36.42ID:sYlI8eNJ
しかし>>795は怒られない
関数とか値コンストラクタとかclass名とかそれぞれの名前空間でちょっとずつ管理法がずれてるんだな
理由は知らんけど
2021/04/06(火) 22:30:07.58ID:sYlI8eNJ
いや>>800さんの言う通りだったかな?
コレ↓は通る
BoolがダメだったのはPreludeで読んでたからだな
ちゃんと修飾なしの場合Main moduleのコンストラクタが選ばれてる

import qualified System.Exit as S

data MyExitCode = ExitSuccess | ExitFailure Int

instance Show MyExitCode where
show ExitSuccess = "MyExitSuccess"
show ( ExitFailure x ) = "MyExitFailure " ++ ( show x )

main = do
print ExitSuccess
print S.ExitSuccess
print $ ExitFailure 12
print $ S.ExitFailure 12
2021/04/06(火) 22:52:08.72ID:vUIEomdt
>>796
エラーメッセージは省略せずに書いてほしい
2021/04/07(水) 15:24:37.74
module BinaryRepresentation.Word8 (
  BiRep8( Rep)
)
where
import Data.Word( Word8)


newtype BiRep8 = Rep Word8

instance Show BiRep8 where
  show a = show' 8 a ""
   where
    show' 0 _ s = s
    show' count (Rep w8) s =
     let
      (q,r) = w8 `quotRem` 2
     in
      show' (count-1) (Rep q) (r `shows` s)
---------↑binary_representation8.hs-----------------------------
2021/04/07(水) 15:24:59.63
module BinaryRepresentation.IPAddress(
  IPv4Address,
  BiRepIPv4Address( Rep),
  makeIPv4
) where
import Data.Word( Word8)
import Data.List( intersperse)
import BinaryRepresentation.Word8( BiRep8( Rep))
import qualified BinaryRepresentation.Word8 as Bi8


newtype IPv4Address = A (Word8, Word8, Word8, Word8)

ipshow::Show s=> (Word8->s) -> [Word8] -> String
ipshow f list = concat . intersperse "." $ (show . f) <$> list

instance Show IPv4Address where
  show (A (_1,_2,_3,_4)) = ipshow id [_1,_2,_3,_4]


newtype BiRepIPv4Address = Rep IPv4Address

instance Show BiRepIPv4Address where
  show (Rep (A (_1,_2,_3,_4)))
   =
    ipshow Bi8.Rep [_1,_2,_3,_4]


makeIPv4::Word8 -> Word8 -> Word8 -> Word8 -> IPv4Address
makeIPv4 _1 _2 _3 _4 = A (_1, _2, _3, _4)
-----------↑binary_representation_ipv4.hs------------------------
2021/04/07(水) 15:25:15.94
[2 of 2] Compiling BinaryRepresentation.IPAddress ( binary_representation_ipv4.hs, binary_representation_ipv4.o )

binary_representation_ipv4.hs:24:11: error:
  Ambiguous occurrence ‘Rep’
  It could refer to
   either ‘BinaryRepresentation.Word8.Rep’,
       imported from ‘BinaryRepresentation.Word8’ at binary_representation_ipv4.hs:8:36-47
     or ‘BinaryRepresentation.IPAddress.Rep’,
       defined at binary_representation_ipv4.hs:21:28
  |
24 |   show (Rep (A (_1,_2,_3,_4)))
  |      ^^^
------------------------------------------------
意図:Word8 値を01表記で表現するモジュールを作り、それを用いてIPv4アドレスを01表記で表現する
問題:binary_representation_ipv4.hs のRepが、binary_representation8.hs のRepと被りAmbiguousである
判明しているワークアラウンド:24行目のRep を BinaryRepresentation.IPAddress.Rep という糞ダサコードへ書き換える
望む事:修飾せずに済ますか、短い修飾で済ませたい
2021/04/07(水) 15:51:36.65ID:6KWn3Zlg
import BinaryRepresentation.Word8( BiRep8( Rep))
↑これ何?消せば?
2021/04/07(水) 18:16:48.26
はわわ。。。通りました
下手にimport書いたせいで通らなくなるとかあるんですね
蛇足importと名付けて教訓にします。ありがとうございました
2021/04/07(水) 23:07:15.55ID:PA0bBjRm
>>808
勘でコード書いてるのかよw
2021/04/13(火) 20:07:55.95ID:WnmkLZut
>>808
> 下手にimport書いたせいで通らなくなるとかあるんですね

ちょ・・・・
2021/04/16(金) 21:11:12.10ID:trr1lKH1
"http2" library v3.0.0 in Haskell has been released
2021/04/16(金) 21:38:11.49ID:gUR6Epkt
>>794
型駆動開発(TDD)はidris作者が本出してるけどそれのことかいな?

であれば予想してるように依存型前提よ
パターンマッチはデータ構築子に沿って分解してるだけだから
(x:xs)だけじゃなくて(xs++[x])でパターンマッチできるようにSQLよろしく型レベルのウインドウ関数つくりましょう
IDEにコード生成させましょう
とかって大変楽しい本だった
2021/04/17(土) 18:14:21.16ID:+4ymujjn
リストを使って漸化式
r_n = max_{1 <= i < n} (p_i + r_{n-i}), r_0 = 0
を解くプログラムを書いたのですがリストをArrayに変えたとたん動かなくなりました
どうやらmax'にifが使われているのが原因のようなのですが動かなくなる理由が分かりません
どなたか分かる方いますか?
プログラムは以下の通りです
import Data.Array

p = [1,5,8,9,10,17,17,20,24,30]

max' (i,q) (i',q') = if q < q' then (i',q') else (i,q)

solver p = array (0,length p) $ (0,0):[ -- 動かない
  foldr1 max' [(i, p !! (i-1) + rs ! (j-i)) | i <- [1..j]]
  | j <- [1..length p]
 ] where rs = solver p

solver' p = (0,0):[ -- 動く
  foldr1 max' [(i, p !! (i-1) + (snd $ rs' !! (j-i))) | i <- [1..j]]
  | j <- [1..length p]
 ] where rs' = solver' p
2021/04/17(土) 18:16:48.86ID:+4ymujjn
動かないと言うのはghciに入力すると結果がいつまで経っても出力されない状況を指します
2021/05/09(日) 10:31:13.12ID:y0UqG5zB
なんでみんなhaskellでアプリ作らないの?
2021/05/09(日) 13:13:30.99
すいません、Microsoft TrueSkill レーティングシステムのHaskell実装を探しているのですが見つかりません
イロレーティングとグリコレーティングしかありません
TrueSkillを実装したライブラリを知ってる方がいたら教えてください
2021/05/09(日) 22:22:49.79ID:HZ/HWpqa
Haskellでアプリ作ろうにもopenglくらいしかまともなバインディングないんじゃなかったっけ?
じぶんでラップするのだるいし
おれはもうf#で作ることにしたよ
2021/05/09(日) 22:24:00.80ID:HZ/HWpqa
あ、デスクトップアプリのことだと思ってたけど違うんかね
2021/05/10(月) 00:08:10.35ID:fW0+gsWX
パターンマッチでRustみたいに
match x {
Some(SeqCst)=>true,
Some(Relaxed)=>true,
_=>false
}

match x {
Some(SeqCst|Relaxed)=>true,
_=>false
}
って感じで書く方法ってある?
2021/05/10(月) 05:06:07.73ID:XvUHL9Z9
haskellでmatchってあるの?
2021/05/11(火) 11:45:43.79ID:cKOIjnA7
>>820
標準ライブラリにはないけどhackageとかにはある

https://hackage.haskell.org/package/regex-compat-0.95.2.1/docs/Text-Regex.html

解説も転がってる

https://sirocco.hatenadiary.org/entry/20090416/1239852340
2021/05/11(火) 11:48:38.64ID:cKOIjnA7
あ、matchって正規表現のmatchじゃなくて?
質問内容がふわふわしすぎで何がしたいのかさっぱり分からん
2021/05/11(火) 11:53:57.18ID:+XHXxVLE
すまん自己解決したわ
or patternsのことを言ってたんだけどissueに上がってるだけで未実装っぽい
https://gitlab.haskell.org/ghc/ghc/-/issues/3919
2021/05/14(金) 16:46:12.69
時期に ARM CPUを載せた端末で 走る Haskell 製ソフトを公式に吐き出せるようになるんです?
2021/05/15(土) 10:53:50.63ID:NqYfkIUy
CPUとHaskellって
まるで中世からいきなりポストモダンに飛んでるみたいな世界観だな
2021/05/15(土) 11:35:40.38ID:DozosAnh
たとえばC言語習いたての難しいと思う理由は、
コンピューターならこれくらいできるだろうと思ってた所に全然届いてなくて
そこを全部自分で埋めなきゃならないことを認識するのに時間がかかること
代数的なHaskewllがデフォならすんなり学習できるかもな
逆に今はCに適応しすぎてHaskellに苦労する
2021/05/15(土) 12:48:56.18ID:NqYfkIUy
>>826
これくらいできるだろうというのは楽観的すぎて苦労するパターンだ
悲観的な方が認識に時間がかからない

Cに適応しすぎているという認識は本当に正しいのか?
ここでも楽観と悲観が対立する
2021/05/21(金) 15:54:58.85
長く時間がかかるプログラムを走らせた時、タスクマネージャーを眺めると、少数のコアに高負荷、残り全コアに低負荷がかかってるみたいなのですが
実行時に使用コア数は指定していないことから推測すると、ガベコレは全コアで稼働するってことでしょうか?
2021/05/22(土) 13:34:14.84ID:hkOb3/u2
Haskellのは単にシングルスレッドで回収してるだけだぞ
2021/05/22(土) 20:46:21.69
え、じゃあなんで全コア低負荷になったんだろ・・・
数分毎に階段のようにRAM使用量が数GBずつ増えて行って
長い処理が終了する直前に全コアフル稼働になって、直後に処理終了になったから
ガベコレが関与してると思ったんですがね
2021/05/22(土) 21:35:55.30ID:aaz7cUPO
サンクが溜まってって最後に遅延してそれらを評価したのでは
というかパフォーマンスの話は変に予測立てたり先入観あったりするとろくなことないからもっと詳細にプロファイリングしたほうが
2021/05/22(土) 21:58:08.22ID:Up5XEM4X
ガベコレ以外に考えられる原因が2つぐらいあったら
ガベコレが原因である確率は1/3ぐらいだから
2/3の方が勝ちそう
2021/05/29(土) 14:13:39.92ID:SnGl3AHf
win10でstackとかghcそのものは正常に入るんたけどパッケージのコンパイルが絡んでくるとどうも文字コードが原因でコケる
LANG=asciiにすると挙動が変わってくるんだけど、何にしとくのが正解なんだろ
834デフォルトの名無しさん
垢版 |
2021/05/29(土) 16:46:49.24ID:1zrkc3qO
100万要素の配列の1要素を更新するために配列の再作成が必要?
https://www.quora.com/Is-Haskell-as-fast-as-C++-If-not-why-not/answer/James-Hollis-19
> Haskell naturally operates on lists, but is rather awkward with arrays. Pure functions do not modify their input, so a pure function that changes one element of a million element array will copy 999,999 elements into a second array and return that. You can get around this with monads, but you end up writing imperative code in something that is less flexible than real imperative code.

これをモナドとアクションで解決できる?どうやるのか?
2021/05/30(日) 20:49:58.16ID:QwiNWDL1
STArrayなりMutable Vectorなり使えば良いのでは
2021/05/30(日) 22:25:02.60ID:F1Ogq3BP
Unsafe でok
所詮物理的にはハードウェア上で動いてるのだから、
副作用なしなんてただの幻想よ
2021/05/31(月) 09:29:30.68ID:O6iiWxP2
副作用の意味を勘違いしていないといいのだけれど・・・
2021/05/31(月) 10:43:40.87ID:xvi5eoqv
Rustと同じように、どうにかして型を弱くすれば副作用は好きなだけ使えるよ
2021/06/01(火) 02:01:57.33ID:4I1ndF8a
IOモナドやSTモナドの中でファイル操作したり現在時刻取って来たりしても問題無いわけだしわざわざ型犠牲にしなくても良いんじゃない
2021/06/01(火) 10:15:13.07ID:UuHFoCEt
書き方が何通りもあってコンパイルが通るのは客観的事実だよ
そんな書き方しなくても良いというのはまあ政治的にはそうなるわけだが
コンパイルエラーにならないのに、バラモンみたいな人間に色々言われると混乱しやすい
841デフォルトの名無しさん
垢版 |
2021/06/01(火) 22:12:35.15ID:HETOiJgb
自然に書いたhaskellコードが極端に遅いという2018年の記事
https://pl-rants.net/posts/haskell-vs-go-vs-ocaml-vs/
2021/06/03(木) 20:42:08.53ID:/+9iJa2F
>>833
自己解決
language-javascriptパッケージのソースのコメントに∉記号がutf8で入ってて、環境によっては違うエンコードで読み込んでエラーになるっぽい
誰かが開発者にワークアラウンドとしてコメントをasciiで書き直してくれとリクエストしてたけど、ビルド環境を整えるのはstackの仕事だから俺は知らんと一蹴されてた
まぁそりゃそうなんだけどさ...
2021/06/05(土) 01:35:57.62ID:qvRyjOjC
>>842
なんという罠…
これ引っかかった人結構いそう
2021/06/05(土) 12:32:22.17ID:aDKd5nip
プログラミング最大の罠のひとつ
自分で創作するよりも他人のソースを読む方が難しい
2021/06/07(月) 12:42:09.06ID:k7DmZ27b
昨日の自分は他人です
2021/06/07(月) 20:28:43.19ID:qbMAaCDK
去年書いたコードが理解できない
2021/06/07(月) 22:37:59.06ID:+U7TScWJ
そりゃあ人間の能力は老化とともに衰えるから仕方ないね
2021/06/07(月) 22:55:42.12ID:OC0V43xk
ここ1, 2年で自分が書いたソースが回ってくることがあるけどほとんど覚えていなかった
今から振り返るともっといいやり方が思いつくけど、他人が書いたコードより遥かに行儀が良くて読みやすかった
2021/07/01(木) 09:54:29.98ID:yiVYCTXd
Hmatrixはcabalで入れたのにghciから:m Numeric.LinearAlgebraや
import Numeric.LinearAlgebraで行列演算モジュールを入れようとすると、

<no location info>: error:
Could not find module ‘Numeric.LinearAlgebra’
Perhaps you haven't installed the "dyn" libraries for package ‘hmatrix-0.20.2’?
Use -v to see a list of the files searched for.

とエラーが出るのだけど、よく分からない。ホームディレクトリにHmatrixのファイルっぽい
ものを置いてもダメ。Numericのフォルダをホームディレクトリに置いてもダメ

分かる人、教えてくださいm(_ _)m

古いパソコンの仮想linuxに入っている奴はimport Numeric.LinearAlgebraで
通常通り動くけど、その他のPCでは動かないんだよね。前は動いていたのもあったけど
ファイル関係いじくり回してたら、設定が狂ったようで動かなくなった

関数型言語で行列演算さえ、導入にこれだけ苦労するとは、どういうことだいw
2021/07/01(木) 13:56:29.22ID:m444U3IV
> ファイル関係いじくり回してたら、設定が狂ったようで動かなくなった
ちゃんとドキュメント読んでないよね?
2021/07/01(木) 18:53:55.58ID:dccggDtp
ghciでimportを複数すると、プロンプトが
Prelude Data.Monoid Data.Traversable Data.Foldable>
と長くなってしまうので、importしたの表示しないようにするにはどうしたらいいのですか?
2021/07/01(木) 18:56:14.18ID:dccggDtp
すまん、自己解決した
:set promptを使えばいいのか
promptでググれば良かった
2021/07/01(木) 22:45:34.96ID:FFAeznD4
quarifiedも使えるよ
お好みで
2021/07/02(金) 03:41:23.49ID:aoQxpJoS
>>849
ghciのコマンドライン引数に、使用したいパッケージを指定するものがなかったっけ?
baseパッケージ以外はちゃんと引数で明示しないとghci上で使えなかったような気がする。
2021/07/10(土) 00:45:51.28ID:FlY7oUIG
すいません
質問させて下さい
Ghc.Types というのを眺めてたんですが
謎の#が入ってるコンストラクターがいっぱい見えます

data {-# CTYPE "HsInt" #-} Int = I# Int#
data {-# CTYPE "HsDouble" #-} Double = D# Double#
newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))

などなど
なんですかコレ?
一方でたとえばDoubleはReal classに属してるのでsinとかlogとかの処理をどこかでやってると思うのですがどこにも見つけられません
もちろんこんなプリミティブな演算はHaskellではなくCとかに丸投げしてるんでしょうけどその手の宣言なりなんなりはないもんなんですか?
2021/07/10(土) 08:27:37.09ID:9m9xryS6
https://wiki.haskell.org/Unboxed_type
記事内リンクも見てね
2021/07/10(土) 09:09:34.41ID:Qo9dk8cs
>>856
なるほど
まだよくわかってないですけどunboxed typeというやつなんですね
後半もどなたか分かりませんか?
実は事情で“多倍長の浮動小数点”を自作したいのです
そのためにはReal型にしなくてはならずsinとなlogとか結構ある数の関数を実装する必要があります
どこかに参考にできるライブラリ転がってませんか?
性能は求めないので多倍長精度の計算ができるReal型を実装してる例が欲しいです
2021/07/10(土) 09:23:00.75ID:Qo9dk8cs
間違えた
Float classがsinとかいっぱいあって難しいです
2021/07/10(土) 09:25:56.65ID:Qo9dk8cs
違う
Floating
orz
2021/07/10(土) 12:08:32.98ID:5i+2sdHC
https://github.com/ghc/ghc/blob/master/libraries/base/GHC/Float.hs#L588
ライブラリがありそうな気がするけど、ghcクローンしてやりたいことできるか調べてみたら
2021/07/10(土) 12:28:39.86ID:5i+2sdHC
hackageをfloatで検索した結果。怪しそうなやつ:
https://hackage.haskell.org/package/variable-precision
https://hackage.haskell.org/package/AERN-Real-Interval
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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