23/01/19 21:33:25.41 QROh3L3M.net
>>199
お前読解力もないのか
もうこのスレ来るなよ
201:デフォルトの名無しさん
23/01/19 21:38:24.06 CHvJHSS4.net
お前も反応すんなよ
202:デフォルトの名無しさん
23/01/20 01:52:23.49 jpIFaaML.net
いくら話題がないからって
203:デフォルトの名無しさん
23/01/21 13:30:02.33 ms4pFp6J.net
職業倫理が苦手です
204:デフォルトの名無しさん
23/01/21 16:31:20.60 c9rqNig0.net
スレチ
205:デフォルトの名無しさん
23/01/29 20:58:33.14 3238s/rq.net
教科書の通りなのになんでエラーになるんだろう?
code:
fork :: (a->b, a->c) -> a -> (b, c)
fork (f, g) h = fork (f h, g h)
main :: IO ()
main = do
print $ fork (map fst, map snd) (zip [0 .. 4] "hallo")
Output:
Error occurred
ERROR line 2 - Type error in explicitly typed binding
*** Term : fork
*** Type : (a -> b -> c,a -> b -> d) -> a -> b -> (c,d)
*** Does not match : (a -> b -> c,a -> b -> d) -> a -> (b -> c,b -> d)
206:デフォルトの名無しさん
23/01/30 02:11:06.80 jVdK8GQm.net
>>205
fork (f, g) h = (f h, g h)
では?
207:デフォルトの名無しさん
23/01/30 04:31:24.57 KsiNNj/4.net
>>206
ありがとうございます。その通りでした。
code:
pair :: (a->b, a->c) -> a -> (b, c)
pair (f, g) x = (f x, g x)
fork :: (a->b, a->c) -> a -> (b, c)
fork (f, g) h = pair (f, g) h
main :: IO ()
main = do
print $ fork (map fst, map snd) (zip [0 .. 4] "hallo")
Output:
-- ([0,1,2,3,4],"hallo")
これで上手く動いたので報告しておこうと思ったら、同じことを2時間以上も前に... oTL
208:デフォルトの名無しさん
23/02/01 14:35:45.13 RAEJFXsc.net
Haskell使い(でLinux使い)の皆さんってxmonad使ってますか?
ウィンドウフォーカスを切り替えるときにfloatingウィンドウは無視するようにしたいです。
オリジナルのfocusUp'関数は
focusUp' :: Stack a -> a
focusUp' (Stack t (l:ls) rs) = Stack l ls (t:rs)
focusUp' (Stack t [] rs) = Stack x xs []
where (x :| xs) = NE.reverse (t :| rs)
と大変記述量の少ない作りになってるのですが、これに最小の変更を加えて目的を実現するとしたらどうするべきでしょうか?
209:デフォルトの名無しさん
23/02/17 00:17:58.82 x2uQcODA.net
ChatGPTにいろんなサンプル書かせて勉強させてもらってるわ
210:デフォルトの名無しさん
23/02/18 07:53:47.68 pwjCq/Fb.net
>>208ですがスレチですかね
Linux板のタイル型WMスレに移動させていただきます (全く動いてないスレなのでダメ元ですが……)
211:デフォルトの名無しさん
23/02/23 22:53:40.11 3VcdShfb.net
すみません
凄いHを楽しく学ぶ本を復習していて
疑問に思って試してみたのですが
具体的な型が決まらない値(単独変数で)は
下記の(Maybeや配列)の他にどんなのがありますでしょうか。
v1 :: Maybe a
v1 = Nothing
v2 :: [a]
v2 = []
型拘束を使わない型変数を使って
ある単独変数の型を定義できない物かと思いました。
また関数でも具体的な型が決まらない値を返す
関数はありますでしょうか。
(Nothingや空リスト以外で)
212:デフォルトの名無しさん
23/02/24 02:14:24.44 PIH/rCf2.net
>>211
Bing チャットに聞いたらこんなのが返ってきた。参考になるかな。
型変数を含むデータ型の例としては、関数型、代数的データ型、型クラスなどがあります。
例: data Tree a = Leaf a | Node (Tree a) (Tree a)
この代数的データ型Treeは任意の型aを要素とする二分木を表します。
例: class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
この型クラスEqは任意の型aに対して等値性を定義するための仕組みです。
213:デフォルトの名無しさん
23/02/25 11:21:45.77 h/PI1ikt.net
>>212
ありがとうございます。
凄いHを楽しく学ぶ本にも
Tree型があったので試してみました。
具体的な中身が「無い」事を現す値の場合
型引数で定義できるみたいです。
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
deriving (Show)
v3 :: Tree a
v3 = EmptyTree
214:デフォルトの名無しさん
23/04/29 14:07:24.45 AoTbqg9O.net
マルチポストだが教えてくれ
【追記あり】ChatGPTじゃなくて人力でモナドが発明された経緯を適当に調べた(ソース付き)。
URLリンク(qiita.com)
この記事正しいの?こんな話聞いたこともないし。圏論でモジュール性なんて扱えるの?
215:デフォルトの名無しさん
23/05/01 00:30:45.06 PDTetkfq.net
>>214
よく分からんけど「モナドが発明された経緯」ではないな
1971年の本ですでにモナドについて書かれてるようだし
en.wikipedia.org/wiki/Categories_for_the_Working_Mathematician
216:デフォルトの名無しさん
23/05/03 20:58:10.10 ioA1phJ7.net
>>214
英語で調べてもそんな話出てきたことはないな。
217:デフォルトの名無しさん
23/05/03 21:14:18.69 ioA1phJ7.net
これにもそんなストーリー書いてない
URLリンク(pdfs.semanticscholar.org)
218:デフォルトの名無しさん
23/06/09 14:58:05.85 GYy2ex4t.net
lispやらカリー=ハワード同型やらの関連性は
数学的な意味では遥か前だし実装上の話かな
URLリンク(en.m.wikipedia.org)
219:デフォルトの名無しさん
23/06/20 00:30:03.89 qm9+2t5E.net
do 記法でのメモ化について質問です
例えば
do
let x <- someComplexExpression
print $ f x
print $ g x
のようなコードがあったとしてxの値はf xの評価の時点とg xの評価の時点で2回別々にされますか?
少なくともHaskell2010 Lang. Rep. (以下HLR2010)ではこのような場合メモ化されて2回展開されることはないという記述を見つけることはできませんでした
なので公式にはこのような記述だと2回展開されると思わなければいけないのだと思います
ではsomeComplexExpressionを先に展開してから、展開したものをxにbindするにはどうすれば良いのでしょうか?
HLR2010ではswqを使えば良いとあるのですがこの場合
x <- seq someComplexExpression someComplexExpression
とかでうまく行くんでしょうか?
またそれでうまくいってるのかどうか確かめる方法はありますか?
つまり実際何回 someComplexExpressionが展開されてる回数を確かめる方法はありますか?
よろしくお願い致します
220:デフォルトの名無しさん
23/06/25 14:24:09.04 H+Ij4nqZ.net
質問にさせていただきます
違う標数での有限体での計算を必要とするコードを考えてます
ある変数に𝔽₃や𝔽₅の値を混在して代入することはないので𝔽₃の元を生成するconstructor F3や𝔽₅の元を生成すconstructor F5を定義して
x = F3 $ 1+2
y = F5 $ 2-5
のような記述ができればいいなと思ってます
そのためには
data FiniteFieldCh3 = F3 Int
instance Num F3 where...
のようにF3,F5両方にNumを定義しないといけません
面倒なのでFiniteFieldと言うクラスを作って以下のようにできないかやってみたところ
class FiniteField t where
modulus :: t -> Int
toInt :: t -> Int
fromInt :: Int -> t
instance ( FiniteField a ) => ( Num a ) where
x + y = fromInt
$ mod ( toInt x ) + ( toInt y ) ) ( char x )
221:デフォルトの名無しさん
23/06/25 14:24:14.71 H+Ij4nqZ.net
以下のようなerror が出てきます
prog.hs:22:10: error:
• The constraint ‘FiniteField a’
is no smaller than the instance head
(Use UndecidableInstances to permit this)
• In the instance declaration for ‘(Num a)’
|
22 | instance ( FiniteField a ) => ( Num a ) where
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
コレはなんですか?
ちなみにFlexibleInstancesというのが必要かとの事なので冒頭に
{-# LANGUAGE FlexibleInstances #-}
を入れています
コンパイラはghc8.4.4です
よろしくお願い致します
222:デフォルトの名無しさん
23/06/25 14:43:47.12 H+Ij4nqZ.net
すいません、最後の行間違って修正前のやつコピペしました
class FiniteField t where
modulus :: t -> Int
toInt :: t -> Int
fromInt :: Int -> t
instance ( FiniteField a ) => ( Num a ) where
x + y = fromInt
$ mod ( toInt x ) + ( toInt y ) ) ( modulus x )
です
よろしくお願い致します
223:デフォルトの名無しさん
23/06/25 15:08:12.64 CDxt6lPg.net
型クラスの単相性制限とか、関数従属性とか、とか。。。
的外れなこと言ってたらごめん。
224:デフォルトの名無しさん
23/06/25 15:23:50.61 CDxt6lPg.net
なんか Bard とかにつっこんでも情報得られるかも
225:デフォルトの名無しさん
23/06/25 17:33:31.79 OvK+yilq.net
ありがとうございます
現在まだ調べてる最中なんですけど
URLリンク(stackoverflow.com)
によるとどうもclass制約の解決をloopさせないための制約くさいです
つまり「aがclasd Cのときclass Dにも入れる事ができる」、「aがclass Dのときclass Cにも入れる事ができる」の宣言
class ( C a ) => D a where ...
class ( D a ) => C a where ...
のような宣言があるとまずいようです
なので=>の左側の型は右側の型より“短い”事が要求されるそうです
例えばtoDみたいな型生成子を作っておいて
class ( C a ) => ( D ( toD a ) ) where ...
などとしないといけないらしいです
でその後newtypeを使うとどうやらこうやら書いてあるんですけどなんのことやら
226:デフォルトの名無しさん
23/07/03 23:45:49.20 QPaqlNti.net
値とmoduleどっちも含んだdata作ればいいのでは
227:デフォルトの名無しさん
23/07/04 00:24:50.19 +0TfLuMN.net
>>226
こういうやつですね
data FiniteField = FF { val :: Int, modulus :: Int } deriving ( Show, Eq)
instance Num FiniteField where
x + y = FF ( mod ( ( val x ) + ( val y ) ) ( modulus x ) )( modulus x )
x * y = FF ( mod ( ( val x ) * ( val y ) ) ( modulus x ) )( modulus x )
fromInteger x = FF x 1
でもコレだと例えば
x = FF 2 7
y = FF 4 7
x + y
のような場合実行時にプログラムは値に格納されてるmodulusを読みに行ってから割り算行うという手間がかかります
しかし私のやりたいプログラムではそもそも各変数のmodulusは確定していてそもそも読みに行くのはバカバカしい感じがします
実行時にxもyも𝔽₇の元と決まりきっててmod の第二引数はコンパイル時点で7と決まっているのにその7を読みに行く作業が無駄に思えるんです
しかもコレは型ではなく値なので型チェックの恩恵も受けることができません
プログラム中に出てくるmodilus事に全部F2型、F3型、F5型‥と全部作って全部のNum instance一個ずつ定義してとやればできるんでしょうけど、何が上手い逃げ道はないものかと
228:デフォルトの名無しさん
23/07/04 11:11:04.93 rN492ZrW.net
この記事では剰余環を作っているみたいだけど、参考にならないかな
URLリンク(qiita.com)
229:デフォルトの名無しさん
23/07/06 01:04:07.84 sds/6LG1.net
みなさん情報ありがとうございます
色々紹介していただいたソースとか自分で探してみた情報とかでまずは一区切りつける事にしました
こんな感じになりました
URLリンク(ideone.com)
230:デフォルトの名無しさん
23/08/05 13:07:07.29 1IOAcn45.net
hage
231:デフォルトの名無しさん
23/09/04 14:41:20.09 FcZAE9nJ.net
haskellは廃れてきてるな、悲しい
スペースリーク対応は難しすぎるしライブラリ類も最新のghcだと使えなかったりしてなんか
実用的な言語じゃないなって思う
xmonadなんかはほとんどBangPatternだよね
そういえば自動でstrictにする拡張が2個ぐらいあったけど追ってないどうなの
232:デフォルトの名無しさん
23/09/16 21:21:50.35 6682wM15.net
数学の集合は普通順番を付けて書くと思うのですが(添字でアクセスできたほうが便利)
なぜ多くの言語では集合に順番がないのでしょうか?
233:デフォルトの名無しさん
23/09/16 21:25:49.38 6682wM15.net
等価判定演算子では順番を問わないが、
記法としては順番によるインデックスアクセスもできる、が便利だと思うのですが
一番基礎的な集合の一つである自然数が順番を重視して扱うように大半の集合は順序を整頓して書かないと実用上不便ではないでしょうか?
234:デフォルトの名無しさん
23/09/16 23:06:28.20 XG1/1lYn.net
順番がないやつと順番があるやつは
なぜ対等な関係ではなく前者が一般的で後者が特殊だと言われるのか?
逆に、複素数はなんで虚部があるやつが一般的で虚部がないやつが特殊なのか?
235:デフォルトの名無しさん
23/09/16 23:13:33.62 6682wM15.net
数学的概念として等価だったりどちらが特殊とか言えないのは納得しています
ただ、集合は順序を維持して記述するようにしたほうが明らかに認知的負荷が少なく、数学的記法でも多くの場合でそうなっていると思うのですが、
多くの言語で組み込み型の集合がそうなっていないのはどのような思想によるものでしょうか?という質問です
236:デフォルトの名無しさん
23/09/17 02:24:17.53 yNwKlKA6.net
データ型としての起源としては
素集合データ構造から始まっているようなので
素である(disjoint)ことがまず要求されて
他に集合という名前が使われていないことから
素で非順序的なデータ型のことを集合型と呼ぶことになった模様
237:デフォルトの名無しさん
23/09/17 02:39:39.55 XqeO/FaW.net
組み込み型とユーザー定義型の区別をなくす思想はある
最も正しいことを実現する思想ではなくミスをした場合の罪が軽くなる
238:デフォルトの名無しさん
23/09/17 23:47:13.96 70jB6wMR.net
初心者は++を使うけどなれたら<>を使ってる人が多い気がする
SemiGroupであれさえすれば使える<>を使った方が汎用的にかけるからかな
239:デフォルトの名無しさん
23/09/18 10:00:00.93 E5yF50jH.net
俗説が廃れるのは「時代が変われば正しさが変わるから」ではありません
俗説が正解だった時代などない
240:デフォルトの名無しさん
23/09/19 19:53:05.75 QCYT99dv.net
unixのtouchを実現したいのですが
{-# LANGUAGE OverloadedStrings #-}
import System.Posix.Files.ByteString
main = do
touchFile "hoge.txt"
touch.hs: hoge.txt: touchFile: does not exist (No such file or directory)
というエラーがでます
ないのは当たり前でtouchで作ろうとしてるのですがバグがあるのでしょうか?
241:デフォルトの名無しさん
23/09/19 19:54:00.31 QCYT99dv.net
unixのtouchを実現したいのですが
{-# LANGUAGE OverloadedStrings #-}
import System.Posix.Files.ByteString
main = do
touchFile "hoge.txt"
touch.hs: hoge.txt: touchFile: does not exist (No such file or directory)
というエラーがでます
ないのは当たり前でtouchで作ろうとしてるのですがバグがあるのでしょうか?
242:デフォルトの名無しさん
23/09/19 19:58:16.28 QCYT99dv.net
すみません、書き込むボタンの反応がなかったので連投になってしまいました
243:デフォルトの名無しさん
23/09/19 20:14:24.31 a563RtWW.net
touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ
244:デフォルトの名無しさん
23/09/19 20:14:45.64 a563RtWW.net
touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ
245:デフォルトの名無しさん
23/09/19 20:18:27.88 a563RtWW.net
ありゃ俺も連投しちまったすまん
なんか5ch重いっぽいね
246:デフォルトの名無しさん
23/09/20 08:38:40.03 I55f6i4N.net
for i in * ; do touch anotherdir/$i ; done
247:デフォルトの名無しさん
23/09/20 08:53:25.46 I55f6i4N.net
>>246(bash)でお茶を濁した
perlが明日消えてなくなるらしいのでHaskellをPerlの代わりに使おうと思う
正規表現とグロブ、ファイル入出力はできた
他に何かあるかな
248:デフォルトの名無しさん
23/09/22 12:15:07.45 NjV4q9P3.net
数値のリストl=[1,10,3]みたいなのを
1 10 3と出力したい。末尾には空白はあってはならないとする
最初
putStrLn $ intersperse ' ' $ foldl' (\acc x -> acc ++ show x) [] l
こんなのを考えたのだが10も1 0と分解されてしまった
しかたなく泥臭いこんなコードを書いたのだがもっといい方法はないだろうか
mp [] = return ()
mp [x] = putStrLn $ show x
mp (x:xs) = do
putStr $ show x ++ " "
mp xs
249:デフォルトの名無しさん
23/09/22 13:06:36.18 8SLDLfd5.net
URLリンク(jutememo.blogspot.com)
250:デフォルトの名無しさん
23/09/22 14:01:02.50 NjV4q9P3.net
putStrLn $ intercalate " " $ map show l
これでいけました
251:デフォルトの名無しさん
23/09/22 14:01:12.58 W8j4O+ex.net
泥臭いだけで罪があるかのように日常的に刷りこまれてるから
本当の有罪確定したやつは絶対許してもらえないよな
そりゃそうだよな
252:デフォルトの名無しさん
23/09/27 15:30:51.70 9Ywamwi5.net
{-# LANGUAGE BinaryLiterals #-}
この拡張をいれても
let t = read "0x111" :: Int -- 16進数にパースできる 273
let s = read "0b111" :: Int -- 2進数にはパースできない
微妙に不便だ
253:デフォルトの名無しさん
23/09/27 17:59:16.99 k7PwLxD8.net
readが定義されたモジュールは別のLANGUAGEってこと?
254:デフォルトの名無しさん
23/10/11 15:16:15.28 1pnnvG+R.net
groupBy (\a b -> snd a == snd b)
これを括弧を使わずにかけますか
groupBy ((==)<$>snd<*>snd)だと(a,b)->Boolとなって(a,b)->(c,d)->Boolとは型があいませんでした
255:デフォルトの名無しさん
23/10/11 17:39:54.48 Fikp0OWy.net
>>254
import Data.Function
groupBy ((==) `on` snd)
結局かっこは使うのだけど、これがあなたの求めるものでしょうか
256:デフォルトの名無しさん
23/10/11 22:05:36.63 1pnnvG+R.net
括弧を使わずにじゃなくてラムダを使わずにでした
まさに欲しかったのそれです
ありがとうございました!!
257:デフォルトの名無しさん
23/10/18 05:38:40.90 vCrdR6l9.net
QuickCheckを勉強しているんですが
Runtime Errorを検出したくて次のように書きました
anの要素は2以上n以下で複数回出現します
testcaseがほとんどdiscardされるのですがリストをchoose (2,n)とかで生成するには
どうしたら良いのでしょうか
verboseCheckを指定してみるとskippedだらけなのですが
スキップしたやつは表示しないで欲しい
prop :: Positive Int -> [Int] -> Property
prop (Positive n) an = all (>=2) an && length an == n ==> monadicIO $ do
a' <- run (solve n an)
assert True
258:デフォルトの名無しさん
23/11/16 18:41:54.01 wXoixzgD.net
岡部健、復活したよ!
エックス内を
“Ken140291“
で探してみて下さい。
最近登録したばかりの様です。
259:デフォルトの名無しさん
23/11/18 16:03:54.22 sLhTkQlu.net
自分で書き込んでいるのでは・・・。
260:デフォルトの名無しさん
23/11/19 15:31:44.23 /inwpH7b.net
>>248
init $ folfl (\a x -> a++[show x]++“ “) ““ [3,10,1] でOK
261:デフォルトの名無しさん
23/11/20 09:46:08.35 sZ0M6Dsh.net
>260 打ち間違えた!
lnlt$foldl(\a x->a ++show x++" ")[][1,10,3]
が正解。
262:デフォルトの名無しさん
23/11/20 14:32:44.66 4MiKC4cJ.net
>>258
ぎゃははははははは
263:デフォルトの名無しさん
23/11/20 21:45:30.49 Jf1v4QK8.net
URLリンク(github.com)
> Unkown(気づいてない)
ウンコウンわろた。
264:デフォルトの名無しさん
23/11/20 23:57:47.37 N43MAaAU.net
スレチ
265:デフォルトの名無しさん
23/11/21 12:01:48.14 MS7pneIs.net
毛の壁くん復活してたのか!!
266:デフォルトの名無しさん
23/11/21 12:21:46.16 W0g+S6dW.net
URLリンク(archive.md)
毛の壁(岡部健)についてはここが詳しい
267:デフォルトの名無しさん
23/11/22 15:27:17.26 1OepVPCl.net
こんなコードがあるのですが
cumsum k = unfoldr next . (,) 0
where
next :: (Int, [Int]) -> Maybe (Int, (Int, [Int]))
next (acc, x : xs) | acc <= k - x, acc' <- acc + x = Just (acc', (acc', xs))
next _ = Nothing
acc <= k-xはわかるのですが、acc' <- acc + xというのはどういう文法なのですか?
リスト内包表記でもないですし条件式の部分でモナドを扱ってるわけではないですよね?
268:デフォルトの名無しさん
23/11/22 16:31:30.12 PuIW3qrN.net
>>267
パターンガードかな
URLリンク(ja.wikipedia.org)(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
269:デフォルトの名無しさん
23/11/23 07:24:43.49 WRBO39fy.net
<-はパターンガード修飾子と呼ぶのですね
初めて知りました
ありがとうございました
270:デフォルトの名無しさん
23/11/24 17:42:26.91 V3Fz2AWZ.net
毛の壁のTwitterの新しいアカウントは
Ken140291
FPFSstutorial
leadmove3648637
です!!
271:デフォルトの名無しさん
23/12/04 12:27:24.28 GjmDAseS.net
>>270
ぎゃっはっはっはっはw
272:デフォルトの名無しさん
24/01/01 20:17:21.69 DcfOChZv.net
mapAccumL/Rの使いどころがよくわからないのですが
どういう時に使うとかの指針ってありますか?
273:デフォルトの名無しさん
24/01/09 22:50:44.14 3mg8b04T.net
ここ5年で発売されたHaskellの書籍で最も優れたものを紹介してください
274:デフォルトの名無しさん
24/01/12 10:55:28.35 cAhPSGjh.net
オワコン
275:デフォルトの名無しさん
24/02/29 01:38:01.78 d2gqoSk4.net
windowsにインストールできんみたいだなcabalがエラー?
まあwindowsでやるなってことだな
276:デフォルトの名無しさん
24/03/03 23:47:35.89 9XAeTkis.net
モナドについて、床下配線に例えられたり、世界を受け取って副作用後の世界を返すと(IOモナドについて)語られたりするのが当時は分からなくて、考えた結果
何かから値を取り出し、関数適用して(その関数が)何かに値を戻す「動き」をモナドという。
って結論になっていたのだが、IOモナドも含めてもっと良い例えはないかと考えた結果、
モナドとは、アウトソーシング(外部依頼)を数学的に表現したもの。
という結論に至った。
アウトソーシング先が(数学の)外の世界だとIOモナドで、同じ数学の世界だとその他のモナド。
それならHaskell自身は「この関数実行しておいて~」って依頼出して結果を受け取るだけだから、
副作用はないと言う主張に矛盾はない(のか?)
(もしくは、IOモナドはHaskellが受け取れる形の値を返すような入出力の「マシン語」を返してる?)
そう考えると、数学が「数学の外とのやり取り」という概念を獲得したと思うと凄い。
277:デフォルトの名無しさん
24/03/04 00:46:59.53 XMYw3zR0.net
箱の中に処理したいデータが入ってるけど一緒にIOウイルスも入ってて
普通に箱を開けるとIOウイルスが外界に漏れて困るから
もう一回り大きい箱を用意してその中に箱とデータ処理装置を入れて
密封した上で内側の箱を開けてデータを処理する
そうすると箱の中に処理されたデータとIOウイルスが入った状態になる
これを延々と繰り返すのがIOモナド
ずっと前に毒ガスで考えた比喩だけど最近だとこっちだな
278:デフォルトの名無しさん
24/03/04 01:02:22.82 vyClhVzf.net
ふーむ。
仮にアセンブラと1対1に対応したCの関数を全部Haskellから呼べるようにすると、出来ちゃうわけで。
(do形式だとまるっきりアセンブラコードに見えるHaskellコードの出来上がり)
そう考えて私のアウトソーシング説が出来た感じですね。
Haskellがモナドを採用したのは数学(関数型言語だったっけ?)の敗北ってどっかで読みましたし。
279:デフォルトの名無しさん
24/03/04 01:22:40.61 XMYw3zR0.net
doの場合は1行ごとに新しい箱が作られてる
順序はたまに前後するけど内側の箱のデータは外側の箱でしか使えないから
必要な順序は保証される
外界の予測不能な状態を全部1つの箱の中に押し込んで
箱の外側の処理装置製造工場は全部予測可能(純粋)にしてる感じ
数学の敗北の意味はよく分からないけど
実用性のために予測不能な状態を持ち込んだことかな
280:デフォルトの名無しさん
24/03/06 10:29:39.18 Yy7OLBEk.net
なんか大げさな例えを使いたがるやつが増えたなぁ
コーディングの上でなんの役に立つんだが
281:デフォルトの名無しさん
24/03/06 15:29:14.97 soRPwZI7.net
「末尾呼び出ししたい関数をデータコンストラクタで置き換える」という仮説は役に立つけれども
(>>=)はコンストラクタではないという事実を見ただけで仮説を捨ててしまうことは科学的によくあること
282:デフォルトの名無しさん
24/04/10 04:46:37.45 +L19CyUd.net
WindowsでghcupをインストールするのにWSLが不要になって
PowerShellだけで導入できるようになってる
283:デフォルトの名無しさん
24/04/13 09:43:59.70 p3ysjEUv.net
rustスレで知ったけどhaskellを正格にして依存型を入れたidris(idris2)つー言語があるんだな
284:デフォルトの名無しさん
24/04/13 10:37:58.47 VEwLcqlL.net
idrisまで興味があるのならHaskell/Elm/Rust/Zigの流れで開発されているRoc-langも見ておくと良い
特にstatic reference counting周り
285:デフォルトの名無しさん
24/04/13 22:46:49.50 p3ysjEUv.net
色々知らないのがあった、ありがとう
static reference countingつーのが流行りなの
最近のhaskellもrustみたいな1回しかつかえない線形型(linera haskell?)が導入されてるね
286:デフォルトの名無しさん
24/04/14 08:32:57.22 ZXz6cRZI.net
IOモナドの入力関数も、引数のない関数=変数と捉えると、実質線形型と同じ。
let x = 0 in return (x + 1) >>= x -> print x
こうすると変数xはシャドーイングによって同名の別の変数が生成される。
getLineとかの入力関数はHaskell(数学)の外で初期化される変数とも考えられる。
287:デフォルトの名無しさん
24/05/17 10:56:06.61 kEVlBeR0.net
参照カウントは0になれば即座にデストラクタを呼び出す
つまり呼び出しを遅延しない
正格にすることと参照カウントを入れることは実質的に同じこと
288:デフォルトの名無しさん
24/05/18 22:55:12.58 HEnIptqp.net
cabalのバージョン上がってたので
windowsで試したらちゃんと動いたわ
気にかけてくれてたんやな
289:デフォルトの名無しさん
24/06/11 20:46:47.08 zqrBHeqN.net
IOモナドを拡張して、副作用をDBだけに限定したモナドとか作れないの?
290:デフォルトの名無しさん
24/06/20 02:22:58.45 s4SRXQdp.net
いつの間にかHaskellがC#より速くなってた…。
URLリンク(nshinchan01.hateblo.jp)
291:デフォルトの名無しさん
24/06/23 11:34:59.09 1+Xj+JzS.net
すみません
GHCのWindows11対応についての質問ですが
「9.2」以前のGHCはWindows11をサポートしていないとの事ですが
URLリンク(gitlab.haskell.org)
これはプログラムコンパイルをして
アプリケーションを生成できないだけで
コンソール内での実行や学習をする分には
「9.2」以前のGHCでも問題ないとの認識で大丈夫でしょうか。
ライブラリが9.0に対応していない物があり確認したいです。
292:デフォルトの名無しさん
24/06/23 21:13:21.29 1+Xj+JzS.net
度々すみません。
GHCのWindows11対応についての質問の件
Windows11機にGHC8.xをインストールして試した所
問題なくコンソールから実行して
結果のデータファイル生成できました。
取り敢えずはこれでやってみます。
293:デフォルトの名無しさん
24/07/03 21:32:31.40 FVo2vRsM.net
Functorってf : value -> valueの関数をfmap f : computation -> computationの関数に拡張してあれこれするけど、
そもそもvalue -> value関数がいらなくない?
わざわざvalue とcomputationを区別するから難しくなるのであって、
全部Functor適用した体で computation -> computationの拡張関数だけ使うように
設計しなおせばもっと普及するんじゃない?
294:デフォルトの名無しさん
24/07/03 23:29:27.98 XPii5wC3.net
何を言っとるんじゃw
295:デフォルトの名無しさん
24/07/04 00:05:21.90 CIK9cQRa.net
computationにしたら理論的にカプセル化されるから、例えばT computationで専用に作った関数はU computationでは使いまわしできない。
だから一般的にvalue -> valueで作ることでT computationでもU computationでも使いまわしできるようにしてるというのはわかる。
でも、そういうところが使いにくくて普及してないんじゃないかと思うから、T computationで専用で作った関数も特に何もせず
U computationの関数として使えるようになったらもっと使いやすくなると思う。
というかHaskellにはcomputationの概念は百害あって一利なしなんじゃまいか。
296:デフォルトの名無しさん
24/07/04 14:17:13.04 PVQ//B0J.net
>>295
君の言うcomputationってどういう定義?
297:デフォルトの名無しさん
24/07/04 19:36:46.28 CIK9cQRa.net
しらんがな。
一応マジレスすると、valueと似ているけどなんか違いがあるもの、ぐらいだろう。
自分の意図としては、”計算機”上で生成されたデータ。
計算機というのは電子計算機に限定されない。
電卓でもいいし、そろばんでもいいし、計算するときのもととなる
数の表現とかをcomputationと呼んでも差し支えないと思ってる。
たとえば、
value:27
に対して電子計算機上だと
11011(2)
で表現されるものがcomputation。
そろばんだったらそろばんの玉の配置。
計算してパチパチ音が出るのが副作用。
逆に言うとvalueの方がわかり難いと思う。計算している計算機の外の世界の
何か数的データみたいな感じがしてわざわざそんな区別いるか?と思う。
298:デフォルトの名無しさん
24/07/04 23:38:08.08 iUDrYol2.net
>>297
computationはvalueの一つ
`5 + 3`がcomputation
`Just 8`もcomputation
299:デフォルトの名無しさん
24/07/05 00:05:27.16 b38yqPqv.net
>>298
computationがvalueの一つだったら
概念的に computation ⊆ value
になるけど。
少なくとも拡張しているのだから
computation ⊇ value
にならないとおかしくない?
`5 + 3`がcomputationというのは前提にもよるからなんとも言えないと思う。
計算して8(=5+3)を導いたなら8はcomputationだと思うが。
たとえば、掛け算だったとして、九九を唱えてゴサンジュウゴで15を導き出したんなら計算してないからvalueだと思う。
300:デフォルトの名無しさん
24/07/05 00:53:37.68 DkqpNxkH.net
>>299
おかしくないよ
OOPでクラスAを継承してクラスBを作った場合(B extends A)を考えてみたら?
`九九を唱えてゴサンジュウゴの結果を導き出す`のがcomputation
導き出された結果と導き出す計算を区別して
301:デフォルトの名無しさん
24/07/05 02:03:56.64 b38yqPqv.net
やっぱりHaskellスレにcomputationネタわかる人いたんだね。
>>300
>OOPでクラスAを継承してクラスBを作った場合(B extends A)を考えてみたら?
ここは納得。
>導き出された結果と導き出す計算を区別して
なにか f: value -> computation型の関数を念頭に置いて
`f ()`はcomputationと言っているのでは?
意図を勘違いしているかもしれないですが、computationはあくまで導き出された結果でしょう。
それと、関数の返り値を導き出す計算をするにあたって出てくる効果を定義に含めようとしているように感じたのですが、
それはあくまで value -> computation型の関数を計算することに付随する性質であって
computation概念そのものじゃないと思うのですが。
あくまでcomputation概念自体はそういう関数を計算して得られた計算結果なんじゃないですかね。
そう考えると何か不都合な例とかあります?
302:デフォルトの名無しさん
24/07/25 23:56:39.51 zdgCFOr2.net
stateやioモナドってHaskell以外でも使われてるの?
maybeやeitherは関数型でない言語でも同等のものがあるから分かるけど、stateやioはいまいち便利そうな感じがしない
303:デフォルトの名無しさん
24/07/26 05:41:42.96 JmafwQnp.net
>>302
それはそうで、IOモナドは他の言語例えばC言語系列だとhoge();の";"部分を数学的に表現しただけだから。
見た目だけなら
x = x + 1;
printf("%d\n", x);
を
return (x + 1) >>= \x -> print x
do形式に直して
x <- return (x + 1)
print x
ただ、x <- の部分は同名の別の変数をシャドーイングしてるので、厳密にメモリの動作まで合わせるならIORefを使う。
Haskellから見たらメモリもIO処理(ファイル処理含む)も等しく外部への入出力という扱い。
だから、実用としては意味が無い。
一見複数行に見えるコードがその気になれば全部一行に出来るという感動はあるが、それだけだ。
Haskellを仲立ちにして数学とプログラミング言語の関係を研究したりには便利。
逆に自力でIOモナドをPythonなどの適当な言語で実装して全てのコードを関数っぽく書ける。
(Pythonだと演算子の自作が出来ないのでf = (>>=)みたいな事になる)
Haskellは便利だから使うものじゃない。
美しいから使うものだ。
あ、でも腐っても最新版は実行速度が結構上がってる(C#/Java並み)ので、選択肢から外される理由も減ってきた気がする。
304:デフォルトの名無しさん
24/07/26 05:47:41.29 JmafwQnp.net
そこまで気づくと、Gtk2hsとかWin32とかのC/C++からのラッパーライブラリを関数型言語っぽくない!って拒否する気持ちが分からなくなる。
305:デフォルトの名無しさん
24/07/26 06:16:02.54 JmafwQnp.net
あ、IOモナドの利点一応あった。
入力関数が他の関数の引数になったり、他の関数に関数合成出来ない。
Pythonのprint(input())みたいなコードや、len(input())みたいなコードは無理。
ここをしっかり分けることで、そういう変な使い方でのエラーは出ない。
もっと広い視点で言えば、入出力がIOモナドという型で分かれているのでネストの深いループの中でも入出力時に型を意識する必要があるので、そういうバグが大分減る。
手続き型関数型関係なく、ネストの深いループの中のデータが今どんな状態かを頭の中で把握出来る人はそう多くない。
だから、デバッグ時に解きほぐしていくんだが、関数型の方が切り分けしやすいかも?
306:デフォルトの名無しさん
24/07/26 06:20:50.81 EERDttnJ.net
Halkellのその先が見たい?
Rustにその答えが全て詰まっている
307:デフォルトの名無しさん
24/07/26 08:11:21.54 3P5OnSpM.net
どなたか教えてください。
数学の構成や命題の証明に使うならば、HaskellとOCamlはどちらがよいでしょうか。
308:デフォルトの名無しさん
24/07/26 12:15:47.14 f34zQmtT.net
Rustは、メモリが見えすぎるのがイヤだー
大したもの書かないから、GCありでお願いしたい
309:デフォルトの名無しさん
24/07/26 17:24:09.33 HoH4md/R.net
>>307
漠然としすぎ
やり直し
310:デフォルトの名無しさん
24/07/26 17:58:43.47 dth0vnjc.net
数学の構成?
311:デフォルトの名無しさん
24/07/27 00:29:15.86 r3Qeb3es.net
>>307
Coqという証明支援プログラミング言語をお使い下さい。
Haskellでも型プログラミングでゴリゴリ自力で命題の証明出来るそうですが、ある程度自動化されている専用言語の方が良いでしょう。
Coqはその中でも日本語情報が多いです。
312:デフォルトの名無しさん
24/07/27 00:43:27.29 r3Qeb3es.net
>>306
実用言語、特に組み込み分野を置き換えるのに期待されてる。
特集記事が無くてもお題スレ見たいな、Rustで問題を解こう的な連載が続いてる辺り、
特にinterfaceの編集陣の熱量は感じる。
Haskellも先駆者の記事によればWeb向けとしては神言語だそうだ。
ただ、周辺環境が未整備なだけで。
(なので、自分で全部作るという茨の道を進む「覚悟」が必要だとか)
未だにそうではないことを祈るが…。
313:デフォルトの名無しさん
24/07/27 00:53:19.48 r3Qeb3es.net
>>307
数の構成の方は、代数的型と基本的な方だと(一部)derivingで自動生成してもらえるから、Haskellはとても楽。
print関数で表示する部分だけでも自動生成してもらう価値はある。
(Read,Enum,Ordで生成されるのは確認済み)
data Nat = Zero | Succ Nat deriving (Show)
連続関数はPCそのものの限界で無理。
代数的型でメモリの続く限りの範囲なら少数も作れるかもしれない。
(その前にリストなり何なりで10進数位取り記法を導入しないと、Natは無限進数なので小数点第1位が1万とか、無限に桁上がりしない構造になる)
314:デフォルトの名無しさん
24/07/27 13:46:44.73 f/jP9uGd.net
>>307
結局こいつがなんの返信もしてない時点で適当に書き込んでたってことがわかるよ
真面目に相手をしないほうがいい
315:デフォルトの名無しさん
24/07/27 16:19:23.58 Z663WedI.net
>>313
ありがとうございます。
316:デフォルトの名無しさん
24/07/27 17:29:46.87 sW1zoNGb.net
>>311-313と>>314は同一人物だよ
騙されないで
317:デフォルトの名無しさん
24/07/27 21:26:10.11 wvv58UYW.net
知ってた
318:デフォルトの名無しさん
24/07/27 23:34:35.07 r3Qeb3es.net
>>316
他人を語ったつもりもないけどね?(ID見れば分かるんだし)
ちなみに>303-305も私だ。
1日2-3回くらいしか見に来ないから、書き込めることはまとめて書き込んだ結果です。
319:デフォルトの名無しさん
24/08/01 12:24:32.72 XzWUPxYY.net
プロセッサメーカはAIブームと見るやこぞってAI処理特化プロセッサの開発競争
関数型言語に特徴的な処理に特化したプロセッサは誰も作ってくれない
320:デフォルトの名無しさん
24/08/01 16:36:21.75 rWBa8MOA.net
それ必要か?
321:デフォルトの名無しさん
24/08/04 23:21:47.06 y1wQ9MUm.net
>>319
スタックコンピューターは、Lispの時にぽしゃった。
322:デフォルトの名無しさん
24/08/05 21:33:27.17 FcOscapW.net
日本企業がLisp専用マシン作ったが第五世代コンピュータプロジェクトが💩で何らまともな成果をあげられなかったからね。
323:デフォルトの名無しさん
24/08/11 17:42:41.08 7wNJGHOt.net
麓から山頂を目指す
foldl: 徒歩で登り切ったら滑り台で向こう側へ降りてゴンドラで再び山頂へ戻りゴール
foldr: ゴンドラでいきなり山頂へ。そこから向こうの麓まで滑り台で降り、そこから山頂へ徒歩で戻る。但しある場合は滑り台を途中で降りてそこから山頂へ徒歩で戻ってゴールにしてもよい
こういうこと?
324:デフォルトの名無しさん
24/08/12 21:44:35.95 EAbaqMlq.net
Preludeのライブラリドキュメントのページが最新のChromeでよく応答なしになるんですが!
現代PCでもプチフリを起こすページとか凄いですね!(怒)
325:デフォルトの名無しさん
24/08/13 01:44:03.00 3Ko8/FbA.net
>>324
hoogle使いんさい。
326:デフォルトの名無しさん
24/08/13 01:45:16.10 3Ko8/FbA.net
>>323
foldl = 末尾再帰を高階関数化
foldr = 普通の再帰を高階関数化
327:デフォルトの名無しさん
24/08/15 10:15:40.11 oieuoNWz.net
yesod を導入しようとして調べているのですが、今は stack 前提で cabal での利用は考えられていないのでしょうか?
導入記事では cabal の記述がありますが、
yesod init すると stack new 使えと表示が出ます。
328:デフォルトの名無しさん
24/08/15 10:30:38.08 oieuoNWz.net
yesod-bin 1.6.2.3 です
329:デフォルトの名無しさん
24/08/19 21:35:37.73 CkMOJkdv.net
rambda.jsのfold相当の関数を教えてください
330:デフォルトの名無しさん
24/08/24 05:56:24.20 WHJg2+SV.net
今ってghcupの時代じゃないの?
久しぶりにHaskell書こうと戻ってきた浦島太郎がstackを最新にしようと思ったら
ghcupとか紹介されてミーハーだから飛びついたわ
331:デフォルトの名無しさん
24/08/24 07:38:35.09 E4GXjFrz.net
Gカップ、ハアーハアー
332:デフォルトの名無しさん
24/08/28 21:41:00.96 HNkudrYA.net
Youtubeでしばらくの間丁寧にHaskellを解説していた人が
ある日「やってらんね、俺はもうHaskellでプログラミングしない」と宣言してHaskellから離れたのを見て
所詮その程度の言語なんだなとガッカリした
333:デフォルトの名無しさん
24/08/28 23:56:40.97 FNkSebMV.net
>>332
Haskellはモナドの実証言語という側面が強いから、モナドは結局よくわからないものという結論に達した今では話題もないし、Haskellで視聴回数稼げないんじゃない。
334:デフォルトの名無しさん
24/08/29 12:50:10.24 D5XAFbVY.net
自作ライブラリの(+)とPrelude.+が被って、Prelude.+使いたい時一々修飾するの面倒くさいしコードも汚くなります
被った時はデフォルトでPrelude.+を使うよって指定することはできないのですか?
335:デフォルトの名無しさん
24/08/29 12:53:31.30 1jszJs3n.net
>>332
+1
336:デフォルトの名無しさん
24/08/29 12:54:42.14 1jszJs3n.net
>>334
自作の方を修飾
337:デフォルトの名無しさん
24/08/29 14:06:11.00 gtm/5H5m.net
>>334
両方使う予定があるのに、何故わざわざ同じ記号にしたのか…。
自分は自作の方を(.+)とか、微妙に変えてる。
338:デフォルトの名無しさん
24/08/29 14:06:50.30 gtm/5H5m.net
使用例:
1 .+ 1
>2
339:デフォルトの名無しさん
24/08/29 16:27:15.59 Nq0HdWD9.net
やだやだ!修飾したくない!
どっちの+か特定して自動的に選択してよう!
340:デフォルトの名無しさん
24/08/29 16:57:49.70 YXIyrRhD.net
何の自作型だか知らんがSemigroup実装して(<>)にでもすれば
341:デフォルトの名無しさん
24/08/29 17:40:12.63 aIGVGYPU.net
就職しろよ
342:デフォルトの名無しさん
24/08/29 20:48:46.38 gtm/5H5m.net
>>339
独自の(+)を自動で使い分けてもらうにはNum型クラスのインスタンスにする必要があるけど、それでも見分けるには型が違わないといけない。
独自の(+)は、独自の型を受け取りますか?
そうじゃないとPreludeの(+)と判別する術がないけど。
343:デフォルトの名無しさん
24/08/29 20:51:12.20 gtm/5H5m.net
あ、できれば型宣言を見せて貰えるとアドバイスしやすい。
344:デフォルトの名無しさん
24/08/31 21:17:53.38 XbdVGeAf.net
ワカランドとして .+. と .-. と .*. を定義することにしました。しかし本質的に解決するにはNumクラスのインスタンス宣言するらしいですね。
しかし独自型同士の+と-、Rationalとの*、Rationalとの/はできますが、
独自型同士の*、独自型同士の/は定義不可能です。
従ってNumクラスになることはできませんでした。
結局どうしていいか判らんどからのワカランドで落ち着きました。
345:デフォルトの名無しさん
24/09/03 18:48:39.95 yXFMfbtr.net
もしかしてData.Mapって遅い?
一日中検索かけてるような処理なら、もうMapを卒業するべきときか・・・
346:デフォルトの名無しさん
24/09/04 00:16:15.77 r/FGXedG.net
Data.Mapというより、リストが遅い。
とりあえずコンパイルの際にghc -O2とかghc -O3とかの最適化掛けてみる。
それでもなお速さを求めるなら、ByteStringとか使うと良い。
もしくは、正格評価版HaskellことIdris 2やRustに乗り換える。
(Idris1と2で互換性が無いらしく、別言語扱いされてる)
Haskellで速さを求めるとバッドノウハウが増えて本末転倒になる。
(そこまで苦労するなら素直に速い言語覚えた方が楽。それでも9.10.1はC#並みにはなった?かな?)
347:デフォルトの名無しさん
24/09/04 15:29:34.52 ZA+d8/X/.net
リストが遅い、しかし多くのデータ構造の構築はリストから(fromList)。
つまりコンストラクション回数をいかに減らすか、一度コンストラクトした物を使いまわすか、ということですか
348:デフォルトの名無しさん
24/09/04 16:12:14.21 LSV34QaC.net
lisp系言語はリストの操作が速いのに…
349:デフォルトの名無しさん
24/09/04 22:00:37.92 r/FGXedG.net
>>347
そういう事。
そして、そういう事を考えさせる時点でどうなの?ってのもある。
文法好きだし、普段使いで困らないけど、速さ求めるなら他の言語使うよねって。
350:デフォルトの名無しさん
24/09/04 22:22:04.95 r/FGXedG.net
>>348
遅延評価だからってのも地味に大きい。
自分はプログラミング言語「数学」の(未完全な)実装として見てるので、遅延評価じゃないと困るが。
351:デフォルトの名無しさん
24/09/05 00:27:39.10 mpd8c2G1.net
普段使いって何してんの
エロ画像収集とか?
352:デフォルトの名無しさん
24/09/05 04:50:37.33 l0HQxOqp.net
PythonやPerlの代わりにテキスト処理に使ってる。
353:デフォルトの名無しさん
24/09/05 18:56:54.85 k3Tfomjz.net
>>351
それ面白いと思って書き込んでんの?
354:デフォルトの名無しさん
24/09/06 09:50:34.80 zzPaKLb6.net
ブラウザでリンク画像が URLリンク(host)
みたいになってて最終的に jpg が表示されてるんだけど
URLリンク(host) をブラウザで開いても
jpg じゃなくて jpg ファイルのイメージがテキストファイルみたく表示される
こういうのは hoge.php の造りが悪い(たぶんhttpヘッダーが可笑しい)んだろうけど
じゃあなんで元頁では画像が表示されてたのかとか疑問は残る
それはともかく欲しいのは jpg ファイルなので
ブラウザに頼らずダウンローダーを描いた
355:デフォルトの名無しさん
24/09/06 09:52:13.17 zzPaKLb6.net
補足
修正前: jpg ファイルのイメージ
正: jpg ファイルのバイナリデータ
356:デフォルトの名無しさん
24/09/07 19:33:25.03 9PXNQc4Q.net
長大な処理となる関数を実行途中にRAM使用量が嵩んでいくとします
中には解放できる部分もある場合について、
このままガベコレせずに進んでいったらいずれOSが『君にはもうRAM貸せないよ』と言ってくるでしょうが、ランタイムシステムは
①その時になってようやく解放できる場所がないか探し出す
①-i 今必要な最低限の確保ができたら即そこに記録して終わり
①-ii 強制的にminorGCを発動して、即そこに記録して終わり
①-iii 強制的にMajorGCを発動して、即そこに記録して終わり
①-iv 強制的にBlockingMajorGCを発動して、即そこに記録して終わり
①-v もはや解放できる場所は見つからないと判断したら例外終了
②何もせず例外終了する
③その他
どれですか?
357:デフォルトの名無しさん
24/09/07 19:35:13.52 9PXNQc4Q.net
文字化けしちゃいました。文字化けした?は1、2,3だと思ってください
358:デフォルトの名無しさん
24/09/08 00:17:59.58 m7MeNrY2.net
loop s なんちゃらかんちゃら
= do
let final_score = long_thunk_score + s
s' = sをなんちゃらかんちゃら
modify' $ Data.Map.Strict.insert key final_score
unsafePerformIO ( evaluate $ rnf final_score ) `seq` loop s' なんちゃらかんちゃら
このStateモナドは、final_scoreは状態Mapへ挿入される時はWHNFでしょうが、直後の行で完全に評価されています
この事はマップに挿入されたfinal_scoreへ影響を与えますか?
つまりマップへ挿入済みのサンクとしての値を後からUnsafePerformIOとevaluateとrnfを組み合わせて狙ったタイミングでRNF化できますか?
359:デフォルトの名無しさん
24/09/09 11:45:42.71 CQiqzRbc.net
>>356
黙って動いてるフリをする
360:デフォルトの名無しさん
24/09/26 23:16:42.97 eAiUCVhs.net
この言語まだ息してるのか?
361:デフォルトの名無しさん
24/09/27 00:41:23.43 ppX7mFe8.net
おまいらは圏論はちゃんとマスターしたか?
最近圏論のお勉強流行ってないみたいだが
362:デフォルトの名無しさん
24/09/28 08:56:06.97 boijaUwp.net
そもそもHaskellに圏論必要ないよ
363:デフォルトの名無しさん
24/09/28 11:20:55.86 szplrxFB.net
背景の理論を理解してないとbrainf*ckと同列のクソパズル言語にしか見えない
364:デフォルトの名無しさん
24/09/28 11:30:45.96 D4fCa7Ze.net
米田の何ちゃらの辺りで心が折れて終了
365:デフォルトの名無しさん
24/09/28 11:48:20.49 M6f6jLKS.net
>>363
> brainf*ckと同列のクソパズル言語
話がそれるけどbrainf*ckがパズル言語なのは100%その通りだよ
しかし構文パーサー、インタープリターやトランスレーター、JITエンジンの実践入門として
丁度良いからこれだけ根強い人気なんだぜ
366:デフォルトの名無しさん
24/09/28 20:40:40.54 SDDTPU1M.net
>>361
流行ってないのか…。
個人的にはHaskellよりも圏論の方に関心が移ってるのに…。
んでも、圏論はHaskellでなくても、全てのプログラミング言語の裏側でも動いてるし、それこそ算数の裏側でも動いてる。
モナドが表に出てきてるからHaskellには圏論が必要って思うかもだけど、モナドって言わないで do形式だけ教えて知れっとしてても良いし、「こういう動きの演算子」としてモナドを紹介するだけでも良い。
受験数学とちゃんと向き合う数学みたいなものだけど、変にモナドを理解しようとすると深みにはまる。
(それはそれで楽しいけど、楽しめる人だけだよね…)
367:デフォルトの名無しさん
24/09/29 07:33:19.55 bBvJfaeS.net
ラムダと束縛変数をマスターしなければdo記法もマスターできないのを
すっかり忘れるぐらいポイントフリーが普及してるでしょ
368:デフォルトの名無しさん
24/09/29 08:45:10.72 3/NLN/+f.net
コーダーが数学の学習に使える時間なんて限られている
時間や基礎知識が足らないので、難解な数学を攻略するのはほぼ不可能
大学生時CSや数学の講義で身に付けておくしかない
369:デフォルトの名無しさん
24/09/29 09:32:49.44 twIz68VA.net
難解な数学を攻略できるなら
日本ではコーダーにはならないよな
370:デフォルトの名無しさん
24/09/29 10:15:01.09 AteoOTMZ.net
業界入るのに難解数学不要
プログラミングにも不要
数学分からんのでgoogle入るのは無理だけど
371:デフォルトの名無しさん
24/09/29 11:01:25.51 bBvJfaeS.net
人工的なルールに依存するのがクソパズルだが
自然界でなおかつ野生のマウンティング的なルールにも依存しないことが数学の目的のひとつだね
372:デフォルトの名無しさん
24/09/29 20:36:16.00 JU2vTa1F.net
圏論が全てのプログラミング言語の裏で動いてるとか適当なこと書くなよ
373:デフォルトの名無しさん
24/09/30 00:30:17.34 Kh4w53R0.net
>>368
高卒の自分でも理解できるんだから、難しいわけではないんだけど。
何度も出てる通り、必ずしもモナドを理解する必要はないし。
そもそも自分がプログラマーの頃だって、12-13時間働いた後も新しいプログラミング言語や数学勉強してたぞ。
(新しい仕事のために学びたくない言語に時間使う事も)
高卒が圏論みたいな大学数学学ぶには専門用語がそもそも分らんから、用語が分かるまで遡った。
(アーベル圏のアーベルが分からないレベルからのスタート)
自分に投資できないと淘汰されるぞ。
374:デフォルトの名無しさん
24/09/30 00:59:39.85 Kh4w53R0.net
>>372
適当じゃない。
モナドは(主に)逐次処理に現れる構造なので、Haskellのような遅延評価で逐次処理自体を作らないといけない(逐次処理をエミュレートするためのモナド)言語でない限り、意識することすらない。
(だからC言語で言う i = 0; の「;」とか言われる)
375:デフォルトの名無しさん
24/09/30 03:08:44.15 g+sPZSfB.net
>>372
沈黙させる努力をするよりも(全ての)人の話を聞くのをサボる方が良い
努力は時間がかかる
一瞬で報われるものは努力ではない
376:デフォルトの名無しさん
24/09/30 12:40:29.07 +8KmLjt4.net
圏論の極々一部のモナドを主語をデカくして圏論ガーとか言ってる人は何も分かってないんだなと思うけどね
俺みたいに数学かじってた人からすると
圏論を勉強すると「あ、この概念はこの分野のこれのことか」ってわかるけど
そうじゃない人は何のことを言ってるのかわからんと思う
専門家でも自分の担当外の圏なんて知らないのに
圏論という括りで語ろうとする人はそういうのすら理解してない
377:デフォルトの名無しさん
24/09/30 13:52:28.73 CD9F70e/.net
やっと普通の人が出てきて安心した
378:デフォルトの名無しさん
24/09/30 13:59:18.70 pkON+G7q.net
>>376
数学者向けの圏論の教科書の応用、具体例は全て数学。
数学知らない人が読んでも分かるわけがない。
応用、具体例、演習をCSの分野から採った教科書が望まれるが、書くのが難しい上に面白くするのも困難。
大体CSすらちゃんと修めてないエンジニアはやはり読めない。
CS自体ベースに位相、代数、グラフ理論と数学使うし。
379:デフォルトの名無しさん
24/09/30 14:09:03.81 rwCIuc1C.net
趣味でやる人に良くいるんだよね。
応用各分野に囚われずに、圏論そのものを学習したい、一般圏論を研究したいって人。
これは数学で言うと、集合論と同じく数学基礎論の分野。
380:デフォルトの名無しさん
24/09/30 19:05:45.94 8C0MP56i.net
操作的意味論とか表示的意味論でプログラムを数学の話にして、その数学を圏論で整理するって話
だからアーベル圏とか具体的な圏はあんま出てこない。
やるとすれば
デカルト閉圏:ランベックがλ計算のモデルになると発見して関数型プログラミング的に重要
クライスリ圏:Moggiが計算効果をカプセル化したときの根拠の圏
ローベア理論:代数的効果をちゃんと理解するときは必要らしい。操作的意味論と表示的意味論と同じようにモナドの理論と妥当性が成り立つようだ。
ぐらいじゃね。
381:デフォルトの名無しさん
24/09/30 21:09:21.28 CVtPTYpb.net
じゃあラムダ計算(のモデル)だけを考えよう
タプルや代数的データ型は使わない
それでもモナドの具体例を作れるのを知ってるのが専門バカ
知らないのが一般国民だ
382:デフォルトの名無しさん
24/09/30 21:29:13.05 8C0MP56i.net
一般国民。
λ計算のモデルでモナド作ってなにかいいことあるの?計算効果結局表現できないんじゃ?
拡張してcomputational lambda calculusやるって話?
383:デフォルトの名無しさん
24/09/30 21:47:09.45 CVtPTYpb.net
ないんじゃないか
ただ「具体例を出せば、いいことがある」とは誰も言ってない
というファクトをチェックするのは悪いことではない
384:デフォルトの名無しさん
24/09/30 21:53:56.34 8C0MP56i.net
いいこと(メリット)があるから具体例が作られると思うんだが。
それは単に具体例の適用が間違ってるって話じゃね?
なんとなく作れるから群構造作ってみましたとかとか目的不在で作ったらそら何がいいかわからんし。
モナドだったら、各計算効果を圏(クライスリ圏)の中に閉じ込めることに成功しました(カプセル化)。
計算効果は強モナドの構造を取っているようです(計算効果の研究のとっかかり)。
みたいないいことあるから流行るんでしょ。
385:デフォルトの名無しさん
24/10/01 04:04:03.18 PZ96E01/.net
別にそれ圏論を持ち出す必要ないよね
ハイおしまい
386:デフォルトの名無しさん
24/10/01 09:39:15.78 KbL1rq/V.net
>なんとなく作れるから群構造作ってみました
ルービックキューブのことか
387:デフォルトの名無しさん
24/10/01 09:46:07.52 y60InQ2q.net
数学屋さんもね
研究では圏を使うが
学生に教えるときは
圏を記述に使わず教えたりする
388:デフォルトの名無しさん
24/10/01 19:23:20.12 7kn4RxVI.net
圏論の話題になったから振ったのに。まあいいよ。
圏論根拠で(ソフトウェア工学的にじゃなくて)数学的にカプセル化が実現されてるってすごい
ことだと思うけどね。
>ルービックキューブのことか
ルービックキューブ解くという目的あるんなら構築する意味あるんじゃない。
389:デフォルトの名無しさん
24/10/01 19:34:54.43 YZm15ve9.net
群持ち出したところで解けないよ
390:デフォルトの名無しさん
24/10/01 20:18:43.32 PZ96E01/.net
圏論がプログラミングの問題解決に寄与するわけないのにね
ただ当てはめてみたってだけのことを過大評価しすぎ
391:デフォルトの名無しさん
24/10/01 20:52:10.03 u1x9FxNe.net
雪田修一の「圏論入門 Haskellで計算する 具体例から」ってどうなん?
392:デフォルトの名無しさん
24/10/01 21:10:04.55 YpLGkLDy.net
板チ
目的と手段を混同したら予選敗退
393:デフォルトの名無しさん
24/10/01 21:16:26.45 7kn4RxVI.net
どうなんって何を知るのに?出たときに立ち読みしただけだけど。
394:デフォルトの名無しさん
24/10/01 21:16:56.98 Ig6Tf0ue.net
>>391
青本と似てて定義の後に具体例を出すみたいな感じだけど
具体例が数学科の人じゃないとわからない内容ばかりなので
結局個別の分野をやらないと理解できないと思う
395:デフォルトの名無しさん
24/10/01 21:38:18.13 Ig6Tf0ue.net
圏論をやりたいならまず代数学をやるべき
それだけでだいぶ見通しが違う
396:デフォルトの名無しさん
24/10/01 21:42:08.00 4kH314XL.net
>>390
モナドの効用で自分の把握してるのは
・数学やHaskellの様な遅延評価の場合、逐次処理を表現できる
(これは変数を使いまわさない場合は、関数合成で十分だが、変数を使いまわすときはモナドじゃないと使いまわせない)
・副作用のある関数を使っても参照透明性は保たれている
・モナドは入れ物前提の概念なので、空の状態を使って例外処理をまとめることができる
正直、普通のプログラミング言語にも役立ちそうな3つ目は実感はしてないけど、ネットで例外処理よりモナドの方が優秀っぽい記事を読んだ
2番目もマルチスレッドとか最適化には役に立ちそうではある
(マルチスレッドなら正格評価版HaskellのIdris2やRustだと思うが)
397:デフォルトの名無しさん
24/10/01 22:05:17.67 4kH314XL.net
圏論全体だと…当たり前のことを構造として研究してるだけなので、圏論というよりはHaskellの型クラスとの合わせ技で関手(Functor)の方がfmap的なのを他の言語にも導入すれば役に立つかも
圏論の関手を一言で言えば(関数も含めた)型変換
(Hakellだと入れ物前提にすることで、関数ごと型変換を実現。本来はもっと柔軟)
自然変換は一言で言えば単位変換とか、大文字小文字の変換
398:デフォルトの名無しさん
24/10/01 22:16:21.15 4kH314XL.net
モノイドは条件が結合法則だけなので、ほぼ結合法則そのものがモノイド
(その割には繰り返しとか数え上げに現れる構造)
そしてモナドも構造はそっくりなので、入れ物前提のモノイドとも考えられる
(モナドの再帰はループ処理でスタックを消費しないし、数え上げは逐次処理と考えられる)
399:デフォルトの名無しさん
24/10/01 23:08:20.75 KbL1rq/V.net
バグを無くすこと自体が目的になりがちなのが数学とプログラムなんだよね
真の目的のため、デバッグを二の次にするやつが正しいと言われても・・・
それって証明とかあるんですか
400:デフォルトの名無しさん
24/10/01 23:21:35.19 syLuNokt.net
>>397
大文字小文字の変換が自然変換の部分kwsk
>>399
目的と手段を区別したら、手段は二の次だと言うのは予選敗退者のポエム
401:デフォルトの名無しさん
24/10/01 23:25:15.70 syLuNokt.net
>>396
> 2番目もマルチスレッドとか最適化には役に立ちそうではある
それもう一人のsimonが取り組んだけどモナドは否定された
402:デフォルトの名無しさん
24/10/02 05:35:22.65 OAhBXB+m.net
やっぱり数学的に表現してみただけってことか
まぁ実際のプログラミングに利益はないわな
403:デフォルトの名無しさん
24/10/02 07:50:08.23 AFS53MaU.net
>>400
よくよく考えたら特別な事じゃないんだけど、普通のプログラミング言語でも大文字・小文字の変換関数を自作するってなったら、文字をInt型に変換して処理する。
それって文字の圏で直接大文字小文字の変換するを作れない場合、一旦整数の圏を経由する関数を作る。
A(a) → B(a)
↓ ↓
A(A) → B(A)
可換図のA(a) → B(a)の逆射が作れれば、B(a) → B(A)が作れる。
ほら、分かってみれば「なーんだ。そんなことか」でしょ?
404:デフォルトの名無しさん
24/10/02 07:53:32.91 AFS53MaU.net
この場合、整数同士の足し算に対応する、文字同士の足し算が作れる。
(ただし、整数と文字列で集合の大きさを合わせる必要がある。0-25とか1-26とかで循環する集合)
405:デフォルトの名無しさん
24/10/02 07:55:35.67 AFS53MaU.net
んで、プログラマーはいちいち集合を合わせないで、エラー処理だったり循環リスト作ったりで対応するわけだぬ。
406:デフォルトの名無しさん
24/10/02 08:30:24.33 VSz9kg2E.net
数学の圏論テキストではカリー化の操作は良く使うが、カリー化の名前を付けて引用することはまず無いね。
407:デフォルトの名無しさん
24/10/02 08:47:20.09 wonXK6QE.net
>>403
大文字小文字の変換が自然変換になる事を(Haskellの例で)証明して、と言う話
(自然変換が何かは分かっているで、直感的に違うと思ったから訊いた)
408:デフォルトの名無しさん
24/10/02 09:21:51.83 ZmuRtoMU.net
大文字の文字列の型から小文字の文字列の型への変換と考えると簡単
409:デフォルトの名無しさん
24/10/02 09:24:29.51 ZmuRtoMU.net
リスト関手から集合関手への自然変換も分かりやすい。
410:デフォルトの名無しさん
24/10/02 10:25:28.13 xCLOcr8o.net
すまん嘘を書いた
自然変換では無くリストの圏から集合の圏への関手だった
411:デフォルトの名無しさん
24/10/02 10:27:20.94 ZmuRtoMU.net
大文字列、小文字列も同様に間違い
412:デフォルトの名無しさん
24/10/02 16:24:48.26 H02uk4bf.net
>>402
ただの記号で表現したら「0の逆数」とかいう表現を禁止するのが難しい
ただの記号ではない方がベター
413:デフォルトの名無しさん
24/10/02 20:27:37.99 AFS53MaU.net
>>407
圏論の自然変換だと文字コード前提じゃないので、[0..25] = ['a'..'z'] = ['A'..'Z']ってする。
んで、大文字と小文字は同じ文字の圏、[0..25]は自然数の圏とする。
lCharToInt c = (length.takeWhile (c /=)) ['a'..'z'] -- 小文字からIntへの変換(関手)
uCharToInt c = (length.takeWhile (c /=)) ['A'..'Z'] -- 大文字からIntへの変換(関手)
toLChar = (['a'..'z']!!) -- Intから小文字への変換(関手)
toUChar = (['A'..'Z']!!) -- Intから大文字への変換(関手)
mytoLower = toLChar.uCharToInt -- 大文字から小文字への変換(自然変換)
mytoUpper = toUChar.lCharToInt -- 小文字から大文字への変換(自然変換)
でも、普通のプログラミング言語のtoLower, toUpperも、Char型を圏とみれば同じ。
可換にするのは面倒くさい上に効率悪いけど、そういう関手を作ろうと思えば作れる。
414:デフォルトの名無しさん
24/10/02 20:45:45.19 AFS53MaU.net
可換図にすると
Char(小文字)
⇗
Int ⇑toL ⇓toU
⇘
Char(大文字)
ここで、小文字→Int, 大文字→Intが作れればtoLower, toUpperを直接作らなくても、関手の合成で作れる。
415:デフォルトの名無しさん
24/10/02 20:53:28.38 4E8lSXKR.net
出番ですよ >>399
416:デフォルトの名無しさん
24/10/02 21:03:02.82 AFS53MaU.net
圏論の地平線でも書かれていたけど、圏論は直接的に役に立つというより、発想の転換の源泉になるそうな。
(なので、別に圏論分かったから偉いとかない)
417:デフォルトの名無しさん
24/10/02 21:18:36.03 JUMm5MLB.net
数学の研究には有用かも知れないが
プログラミングで
直接役に立つようなことはまず無い
418:デフォルトの名無しさん
24/10/02 21:42:50.80 Xrjxo4NT.net
どっ白け
419:デフォルトの名無しさん
24/10/02 21:51:30.73 OPLMo7z3.net
プログラミング言語もどんどん数学に寄せているし、上のカキコみたいにプログラムの記述を
そのまま数学的対象とみなせるように改造していってると思う。本来は別物と考えるべきだと思う。
数学の研究といってもプログラム意味論の研究で、プログラムを数学の世界に写像したら
どう表現できるかということを研究していると言えるんじゃないかと思う。
数学の世界には、式の評価途中に発生する副作用といった概念がないので、現実のプログラムを
そのまま数学の世界に移そうと思ってもできないことの方が多い。
計算効果を圏論的に表現できたというのは、そういうプログラミング言語の数学化の一端みたいな
もんだと思う。
420:デフォルトの名無しさん
24/10/02 22:00:14.12 YWEZQEUD.net
副作用ってどうでもよくね
Haskellとかだとそもそも副作用ないし
421:デフォルトの名無しさん
24/10/02 22:12:34.31 OPLMo7z3.net
現実のプログラムだと式を評価する途中で発生する副作用というのは普通だけれど、
これを表示的意味論、操作的意味論で数学の世界に写そうと思うと途端に難しくなる。
数学で式の途中に文字列をディスプレイに映し出す、みたいな概念はないから。
それを整理して副作用と呼んでも差し支えない概念を提唱してHaskellに実装しているんだよ。
実際、IOモナドの圏論的定式みるとこれが副作用?という表式してる。
全部後回しにしてフラッシュするというアイディアみたい。副作用をプログラムの最終局面で
実行しているから、式の評価途中の参照透明性も壊さない。なるほど、って感じ。
422:デフォルトの名無しさん
24/10/02 22:20:07.75 sFAdPyYV.net
ID:OPLMo7z3 = ID:AFS53MaU 本人か同レベル
複おじってレベル
423:デフォルトの名無しさん
24/10/02 22:24:19.37 YWEZQEUD.net
途端に難しくなるか?
副作用のない計算に変換する手順が教科書に書いてあるはずだが?
424:デフォルトの名無しさん
24/10/02 22:29:49.51 OPLMo7z3.net
>>422
別の人。自分ならプログラムの記述を一回数学の世界に写すし。
>>423
副作用のある数学的関数ってある?
プログラム→数学
に変換するんだぜ。
副作用のない計算に変換する手順が数学の本に書いてあんの?
425:デフォルトの名無しさん
24/10/02 22:43:26.42 +kVmY7U4.net
>>424
別人とのことなので便乗
ID:OPLMo7z3 は ID:AFS53MaU が
> 大文字小文字の変換が自然変換になる事を(Haskellの例で)証明して
と問われて
>>413,414 を出してきたのは数学的証明だと思ってるの?
426:デフォルトの名無しさん
24/10/02 22:46:45.28 +kVmY7U4.net
>>424
或いはもっと直接的に、>>424は「大文字小文字の変換が自然変換」の真偽をどう考えているの?
427:デフォルトの名無しさん
24/10/02 22:51:00.95 OPLMo7z3.net
定義が何もないのに何も言えるわけないじゃん。
数学でこういうものを定義します、これをプログラムのこれこれと対応付けます。
てプロセスないじゃん。
428:デフォルトの名無しさん
24/10/02 22:52:03.28 YWEZQEUD.net
>>424
先に副作用のないプログラムに変換するって言ってるんですけど
Haskellなら最初から副作用がないからそのままでいいけど
プログラミング言語の理論の本ならどれにでも書いてないか?
429:デフォルトの名無しさん
24/10/02 22:55:13.15 +kVmY7U4.net
>>427
了解
>>422の指摘通りだと納得しました
430:デフォルトの名無しさん
24/10/02 22:56:24.21 OPLMo7z3.net
いや。プログラム意味論の本結構探し回ったけど副作用の記述は漠然としてて
扱えないわけじゃないらしいけど、具体的な変換なんて見たことない。
ちょうど伝統的なプログラム意味論で副作用どう扱われているか調べているんだ。
なんて本に書いてありましたか?
431:デフォルトの名無しさん
24/10/02 23:02:49.62 YWEZQEUD.net
どれにでも書いてあるだろ、whileプログラムをラムダ計算に変換する手順とか書いてないなんてことがあるわけがない
432:デフォルトの名無しさん
24/10/02 23:06:08.21 OPLMo7z3.net
なんだ。いや聞きたいのは入出力とかの副作用だよ。
433:デフォルトの名無しさん
24/10/02 23:17:44.98 YWEZQEUD.net
入出力なんて代入に比べたら自明だろ…
そんなのいちいち教科書に書くかよ
434:デフォルトの名無しさん
24/10/02 23:26:30.50 OPLMo7z3.net
書いてないのは自明だからではなくて、研究の方向性がどう転ぶかわからないからだと思う。
表示的意味論も出た当時の文献では副作用について語ってることが多い。
現代的な本になるほどD∞モデルつくってはいおしまいで数学的にきれいなところしかやらない。
435:デフォルトの名無しさん
24/10/02 23:36:01.67 JUMm5MLB.net
プログラムの仕様とその証明を数学で記述する本にあるだろうね。
436:デフォルトの名無しさん
24/10/02 23:37:10.87 YWEZQEUD.net
どこが非自明なのかさっぱりわからん
代入と違って入出力は垂れ流しだし、入出力は代入の特別な場合だろ
437:デフォルトの名無しさん
24/10/02 23:46:11.64 OPLMo7z3.net
>>435
ホーア論理とか公理的意味論か。いやそれはないな。あっても一般に適用できないし。
>>436
関数型プログラミングだとプログラムをλ式に対応させて、プログラムの実行をそのλ式の簡約に
対応させるというのが理想的なモデルとして想定されることが多いと思う。
でもλ式はλ項からλ項への対応でしかないから、λ項を値(value)と呼ぶとすると
value から valueへの数学的関数でしかない。これには入出力とかの副作用を表現する余地がない。
つまり、
入出力があるプログラム→value から valueへの数学的関数
という対応付けをすると、入出力という特徴が数学世界では失われてしまう。
という難問があった、けどモナドで一つ解答が出た。
438:デフォルトの名無しさん
24/10/02 23:54:51.93 YWEZQEUD.net
代入が書けるんだから、入出力なんて自明だろ…
こいつ何いってんだ…
439:デフォルトの名無しさん
24/10/03 00:02:36.12 B2Xmf+Xl.net
だから、入出力がある数学的関数なんてないだろって言ってんの。
数学的関数で入出力は非自明だと思うんだが。
440:デフォルトの名無しさん
24/10/03 00:09:13.65 B2Xmf+Xl.net
Haskellでいうと、
純粋関数は、λ式(valueからvalueへの数学的関数)
に対応付けられるけど、
IOモナド使ったプログラムは、その現実のプログラムが持つ特徴を表現できるλ式がないので対応付けられない
って言ってんの。
441:デフォルトの名無しさん
24/10/03 00:21:32.37 omgk7HiD.net
入出力なんてただの値のリストだろ…
442:デフォルトの名無しさん
24/10/03 03:50:19.64 KCHr29fD.net
圏論持ち出して愚にもつかないことをグダグダと…
それで何か効率良くなるならいいんだけど,何のメリットもないんだよね
443:デフォルトの名無しさん
24/10/03 04:21:38.74 zyXzLypu.net
圏論なんかより、遅延評価ならIOがwhnfの先頭に出てきたら実行すればいいって人類が気づいたのが本質なんじゃねーの
444:デフォルトの名無しさん
24/10/03 08:29:58.17 LNI2TnSo.net
最近の人類はseqのメリットを直接的に利用するコツに気づいとるんか
順調に進化しとるな
445:デフォルトの名無しさん
24/10/03 14:31:37.97 1wv2Oz28.net
コンパクトな言語仕様だが表現力は強力
数学をプログラミングに取り入れるメリットってまぁこんなもんでしかないでしょ
一方で静的に性質を決定しようとするやり方は一般的な人間の能力を簡単に超えてしまう
446:デフォルトの名無しさん
24/10/03 16:46:40.39 TkNlnb1D.net
急にポエマーだらけw
447:デフォルトの名無しさん
24/10/03 19:56:29.70 B2Xmf+Xl.net
入出力があるプログラムをどう数学的に整合する概念に対応させるかについて書いてみる。
こういう説明が通るものなのか興味があるし。
まず、仮想的なシェルスクリプト風の行番号付き手続き型言語を想定して、
その言語で入出力があるプログラムを定義するとする。
000 procedure prog1(int n) {
001 double res
002 (なにか込み入った計算)
....
020 echo "hogehoge"
021 (なにか込み入った計算)
....
050 echo "fugafuga"
051 (なにか込み入った計算)
...
100 return res }
このプログラムは実行 $(prog1) すると、行番号001版から順に評価していって複雑な計算をしつつ途中
hogehoge ← 行番号020の命令を評価
fugafuga ← 行番号050の命令を評価
と表示した上で、返り値 res を返す、という動作をする。
448:デフォルトの名無しさん
24/10/03 19:57:08.78 B2Xmf+Xl.net
現実のよくあるプログラムとはこういう感じのものだけれども、実行 $(prog1) をしてその結果が返ってくるという現実的に
必要な点だけを考えると、途中の行番号020を評価したとかそういう情報はいらなくて、結局 $(prog1) して
hogehoge
fugafuga
を表示して、複雑な計算の結果 res が返ってくれさえすればいいともいえる。
だったら、数学的に取り扱いがしづらい、式の評価途中で入出力が発生するみたいな部分を取っ払って
000 procedure prog2(int n) {
001 double res
002 (なにか込み入った計算)
....
020 ## echo "hogehoge" #コメントアウト
021 (なにか込み入った計算)
....
050 ## echo "fugafuga" #コメントアウト
051 (なにか込み入った計算)
...
100 return ("hogehoge"を表示する予約1、"fugafuga"を表示する予約2、返り値 res) }
というように、返り値の部分に全部まとめるということをするということが考えられる。こうしても、プログラムのユーザー側からすると
実行すると$(prog2)
hogehoge
fugafuga
と表示されて複雑な計算した結果 res が返ってくるということは変わらない。
449:デフォルトの名無しさん
24/10/03 19:57:34.71 B2Xmf+Xl.net
というわけで、入出力があるプログラムというのは、こういう返り値の部分というか評価の最終段階の部分に「入出力の予約情報と返り値の情報がまとめられたもの」だったんだ、と整理しよう。
ただ、こういう「入出力の予約情報と返り値の情報がまとめられたもの」と長い文で表すのはよろしくないので、何か名前を与えた方がいいということで
computationと呼ぶことにする。
そうすると、Haskellでいえば、
純粋関数は、valueからvalueへの数学的関数
に割り当てることができたけれど、
入出力付きのプログラムについては、valueからcomputationへの対応
に割り当てるということが数学的に正当化できそうだ、ということになるわけだ。
450:デフォルトの名無しさん
24/10/03 20:00:39.07 B2Xmf+Xl.net
訂正
computationというか、今でいう「入出力の予約情報と返り値の情報がまとめられたもの」を
数学的にうまく正当化するということが達成することができるのであれば、
入出力つきのプログラムを、valueからcomputationへの対応
に割り当てるということが正当化できるはずだ、と考えられる。
451:デフォルトの名無しさん
24/10/03 20:23:28.46 zyXzLypu.net
何言ってるのか全然わからん
ぶっちゃけ入力は関数の引数にして、出力は返り値にするように変換するだけでいいだろ
読み出し位置のカーソル管理が必要なら代入を使えばできるじゃん
452:デフォルトの名無しさん
24/10/03 20:39:38.40 B2Xmf+Xl.net
よくわかんないけど、そういう入出力プログラムがあったとする。
そしてそれを引数付きで実行することを考えると
$(prog n)
こうなる。ここで、引数の部分の n はプログラムの記述に属さないといけない。
なぜかというと現実世界の「入力」部分をそのまま引数のところには持ってこれないから。
引数部分を入力にするにしても、別途入力されたものをプログラムの変数に割り当てる概念
みたいなのが必要になるし、それは関数の引数だからということでは説明にならないと思う。
だから、少なくともprogの引数部分はvalueじゃないといけない。
453:デフォルトの名無しさん
24/10/03 20:45:47.19 zyXzLypu.net
ポエムすぎて意味わからん。値のリストはvalueじゃないと?
454:デフォルトの名無しさん
24/10/03 20:59:58.72 B2Xmf+Xl.net
値のリスト自体をそのまま持ってくればvalueということになるんだろうけれど、
$(prog n)
の実行結果として出てくるもので、計算効果の説明になるものであって、返り値の型を包含するもの
であればcomputationと判断せざるを得ないとかそういうことしか言えないです。
455:デフォルトの名無しさん
24/10/03 21:11:15.46 zyXzLypu.net
判断するって何言ってるの?
computationって定義は何なの?
ラムダ項を書き換えていく手続きが計算じゃないの?
456:デフォルトの名無しさん
24/10/03 21:22:37.64 B2Xmf+Xl.net
valueとcomputationの違いは微妙で$(prog n)の実行結果として出てくるかどうかとか
計算効果が発露しているかというところで見極めるしかない、と理解している。判断する
というのは専門用語としては使ってない。
computationの定義はまた微妙だけれど、$(prog n)の計算効果込みの実行結果みたいな概念。
最後は超個人的見解だけど、「λ項を書き換えていく行為」というのは、どういう方法で表現して
どういう方法で簡約していくか?というところが決まってない。λ計算じゃないけれど、
1+1=2
という計算を暗算でやるか、電卓でやるか、そろばんでやるかという違いを出しても計算することに
変わりない。
暗算でやると、脳内物質の分量が変わるし、電卓だと電位が変わる。そして、そろばんでやると
「ぱちぱち」という音が出る。
457:デフォルトの名無しさん
24/10/03 21:30:24.72 zyXzLypu.net
❌決まってない
⭕知らない
間違えるなよ
458:デフォルトの名無しさん
24/10/03 21:31:19.82 zyXzLypu.net
お前の脳内にしかないお花畑に巻き込むのやめてもらっていいですか?
459:デフォルトの名無しさん
24/10/03 22:10:04.42 /brOvmjG.net
おそらくメンタルヘルスに問題がある方なのかな?
自分の頭の中の映像をそのまま言葉にしたような感じを受ける
460:デフォルトの名無しさん
24/10/04 05:46:29.14 vLDssEdm.net
>>428
Haskellの副作用については2つの解釈がある。
1.副作用も含めてアクションという単位で値としてみる。
(アクションを受け取って、アクションを返す関数)
2.Haskellは指示書を発行しているだけで、実際に実行するのは数学(Hakell)の外だから、Haskellそのものには副作用が無い。
((末尾にHaskellに値を返す形の)マシン語を返して、ハードウェアに実行してもらうと考えるアウトソーシング方式)
461:デフォルトの名無しさん
24/10/04 05:52:21.21 EogKDI3R.net
>>460
ようするに副作用はないってことじゃん
462:デフォルトの名無しさん
24/10/04 05:57:16.46 vLDssEdm.net
>>461
Javaは変数をクラスの外で作れないから、グローバル変数は存在しない。
けど、事実上のグローバル変数は作れてしまう。
ってのと、同じ。
アクションの中に副作用があろうが、マシン語を返していると解釈しようが、事実として副作用はある。
ただ、重要なのは副作用を伴っても参照透明性が保たれているってこと。
463:デフォルトの名無しさん
24/10/04 06:07:02.79 4jD3Hbcp.net
副作用が隔離できていることが大切
スレの基地外の隔離スレのように
464:デフォルトの名無しさん
24/10/04 06:24:04.70 EogKDI3R.net
>>462
それは例えばwhileプログラムから副作用のない言語に変換したあとの形式と同じ状態にすでになってるってことで、計算のルール上はもう副作用はないでしょ
465:デフォルトの名無しさん
24/10/04 07:22:19.19 vLDssEdm.net
>>464
そうなんだけど、結局普通のプログラミング言語を使ってる人にしてみれば屁理屈でしかない。
見た目そのままで伝えるなら、純粋関数型言語の定義のまんま、「副作用を伴っても参照透明性が保たれている」でいい。
466:デフォルトの名無しさん
24/10/04 07:38:19.23 EogKDI3R.net
>>465
まあそのほうがいいか
上の方にいた彼はなんか脳内にこだわりがあって、普通の型付きラムダ計算以上のことをやってると思ってるフシがあったね
467:デフォルトの名無しさん
24/10/04 07:48:51.79 vLDssEdm.net
>>466
そうそう。
副作用は無い!って、こっちが必死になって弁を述べれば述べるほど、屁理屈感が出てくる。
それよりは副作用を認めて、「副作用を分離」「副作用を伴っても参照透明性が保たれている」って言った方が、納得感がある。
468:デフォルトの名無しさん
24/10/04 19:23:08.02 tixO3LDq.net
とりあえず続きを書いてみる。
Haskellでいうところの
純粋関数は、valueからvalueへの数学的関数
入出力プログラムは、valueから(入出力)computationへの対応
に割り当てることで、数学上にプログラミング行為を写し出せそうだ、というところまで書いた。
ただ、やっぱり(入出力)computationって何?とか、valueと形式的にどう違うの?という疑問は拭い去ることができない。
そこでMoggiは、次のようなアイディアを2つ出して(結構ムリヤリに)疑問を解決した。
ただし、ここで入出力プログラム prog は A型の引数を取って(computationの整理をする前は)B型の返り値を返すとする。
469:デフォルトの名無しさん
24/10/04 19:23:42.06 tixO3LDq.net
Moggiのアイディア1
・返り値の型がBのcomputationは、何か型構築子をIOとすると、その型構築子を適用した型 IO B のvalueに対応する。
※Moggiの原理ともいう。
つまり、上で挙げた入出力プログラム prog の型は、具体的に A → IO B になると言っている。
IO B 型の実装で、入出力の予約だか、値のリストだか指示書だか表現はいろいろあるが、そういう機構を実装すれば、
prog :: A → IO B
は参照透過性を保ったまま入出力を行うプログラムになる。
もっと広がりが出そうなcomputation概念なのに、急に狭窄な感じがするアイディアだけれど、
実装と折り合いをつけるという観点からすると仕方ないともいえる。
なお、代数的効果のPlotkinとPowerが批判しているのはこのMoggiのアイディア1である感じがする(あんまわかってない)。
470:デフォルトの名無しさん
24/10/04 19:24:13.18 tixO3LDq.net
Moggiのアイディア2
・入出力プログラム(に対応する数学的概念)は、圏をなすはずだ。
Moggiのアイディア1の段階でもprog :: A → IO Bは参照透過性を保ったまま入出力を行うプログラムになるはずだが、
入出力プログラム同士の合成が考えられていない。入出力プログラム prog1、prog2と開発したら、できるだけ再利用するというのが
現実のプログラミングだと思う。わざわざprog1とprog2の合成として定義できそうなプログラムを得るために、イチイチいちから
開発するということを理論的に要請されるというのは不合理。
純粋関数は、λ式に割り当てられることになって、当然、圏をなすだろうに、
プログラムに割り当てられるものが圏を成さないというのはおかしい。
でも、入出力プログラムはMoggiのアイディア1から、
prog :: A → IO B
という特殊な返り値の型を持っているため単純な合成ができない。
471:デフォルトの名無しさん
24/10/04 19:29:03.13 tixO3LDq.net
Moggiのアイディア1の段階でcomputationの概念というのは解消してしまう。
PlotokinとPowerはそこが不満なんだろうか?
472:デフォルトの名無しさん
24/10/04 20:18:31.78 WSIC8Xt5.net
だから、副作用を隠してラムダ計算に変換する手続きは、世界をステートにする変換をした時点で達成されてるわけで、そんなの太古の昔から分かってたことだろ
IO aの定義読んでから出直せよ
473:デフォルトの名無しさん
24/10/04 20:30:15.44 SclsbEZF.net
日を跨ぐつもりならコテハンでも付けてくれんか
追えん
474:デフォルトの名無しさん
24/10/04 20:44:30.01 tixO3LDq.net
>>472
だからそれはわかっているって。評価途中では実際の入出力はせず指示書だか値のリストだけ作成して
参照透過性を保証して、参照透過性が要求されなくなったプログラムの最終段階でリストに従って
入出力を実行するような仕組みがあれば、参照透過性を保ったまま入出力はできるという話でしょ。
それを数学的にどう正当化するかという話を書いているんだって。
>>473
水曜日あたりからだからそんな分量ないよ。
475:デフォルトの名無しさん
24/10/04 20:49:17.68 WSIC8Xt5.net
>>474
どこが正当化されてないのか意味不明なんだけど
ていうか正当化って何?
476:デフォルトの名無しさん
24/10/04 20:51:48.70 tixO3LDq.net
だから、入出力がある数学的関数なんてないじゃん。
入出力があるプログラムを数学的に表現しようと思っても詰むからどうしようって話。
477:デフォルトの名無しさん
24/10/04 20:57:28.69 6lZW+X9H.net
こんなところで長文書くのはやめてもろて
読む価値があるものならzennとかnoteに書けば?
関数型言語界隈の人たちがクソミソにレビューしてくれるよ
478:デフォルトの名無しさん
24/10/04 20:58:08.93 WSIC8Xt5.net
>>476
型付きラムダ計算の時点で数学的に表現されてるだろ…
意味不明すぎる
479:デフォルトの名無しさん
24/10/04 21:00:48.64 qBjLuAvO.net
メインの入力とメインの出力は数学にもある
主じゃないやつを副作用といってる
480:デフォルトの名無しさん
24/10/04 21:11:30.04 tixO3LDq.net
>>478
なるほどそう考えていたのか。全部λ計算でアセンブルすりゃ数学的に還元できるだろうってわけね。
でもそうだとすると文字列を表示するハードウェアの部分はどう還元するの?
>>479
よくわかんない。具体的に言うとどういうのある?
481:デフォルトの名無しさん
24/10/04 21:11:31.21 tixO3LDq.net
>>478
なるほどそう考えていたのか。全部λ計算でアセンブルすりゃ数学的に還元できるだろうってわけね。
でもそうだとすると文字列を表示するハードウェアの部分はどう還元するの?
>>479
よくわかんない。具体的に言うとどういうのある?
482:デフォルトの名無しさん
24/10/04 21:18:24.66 WSIC8Xt5.net
>>480
アセンブルって何?
後半も何言ってるのかちゃんと分かるように書いて
483:デフォルトの名無しさん
24/10/04 21:25:06.50 WSIC8Xt5.net
そうだよ、こんなとこじゃなくてzennとかに煽った感じのタイトルつけて炎上する記事書いてコメントもらって来いよ
484:デフォルトの名無しさん
24/10/04 21:28:05.10 tixO3LDq.net
λ計算を機械語とかアセンブラと見立てて、λ計算ですべて数学世界を組み立てれば、
入出力がある数学的関数も定義できるだろうから、あえて数学的正当性なんて与えようとする
理由がわからない、ということだろうと思った。
プログラムの部分は全てλ計算で組み立てれば完全に同じものが作れると思っているということ
だけれども、じゃあ文字列をディスプレイに表示するというプログラムの構成要素である
ディスプレイはハードウェア部分だけれども、それはλ計算で組み立てるという範疇にはいるんですか?
入らないなら、なにか数学的概念を持ち出してきてそれに対応付けるということをしないといけないんじゃ
ないですか?
という趣旨のことを書いた。
485:デフォルトの名無しさん
24/10/04 21:33:15.17 tixO3LDq.net
これ読んだらわかるけどMoggi論文の読書感想文。いまさらの。
匿名以外でいまさら突っ込んでくるわけないじゃん。
486:デフォルトの名無しさん
24/10/04 21:33:16.29 tixO3LDq.net
これ読んだらわかるけどMoggi論文の読書感想文。いまさらの。
匿名以外でいまさら突っ込んでくるわけないじゃん。
487:デフォルトの名無しさん
24/10/04 21:34:24.07 qBjLuAvO.net
関数の「型」を見ろ
入力が何で出力が何かが宣言されている
488:デフォルトの名無しさん
24/10/04 21:39:26.17 tixO3LDq.net
>>484
ディスプレイに表示するまでの概念はよく考えたら既存の例でもなかったわ。
焦って変なこといったスマン。
ちょっと説明を考える。
489:デフォルトの名無しさん
24/10/04 21:39:59.29 WSIC8Xt5.net
>>484
意味不明すぎる
ラムダ計算は数学的に正当化されてるだろ
例えば合流性があるとか数学的に証明されてる
これのどこに非数学的要素があるんだって言ってるんだよ
すでに数学的な説明がされてるものに対して、数学的に正当化されてないとか言うのやめろよ
490:デフォルトの名無しさん
24/10/04 21:48:55.49 tixO3LDq.net
λ計算が数学的に正当化されてないというような話はしてなくて、
現実のプログラムをλ計算に反映させようと思っても入出力とか非決定計算の部分は表現しきれない
そのλ計算からはみ出す部分をどう正当化させようかという話。
491:デフォルトの名無しさん
24/10/04 21:52:13.21 WSIC8Xt5.net
>>490
じゃあHaskellは純粋にただの型付きラムダ計算なんだから、数学的に正当化されてない部分などない
おしまい
492:デフォルトの名無しさん
24/10/04 22:03:12.33 tixO3LDq.net
>>491
うーん。例えば、数学は集合論上で展開されているから、集合論があればその上で展開される
解析学とか、線形代数学とかいらない、みたいな論法じゃない?
この現象は、解析学でモデル化できるけれども、解析学は集合論上で展開できるから、
そんなモデル化はいらなくていちいち集合論の言葉で書けばいいじゃん的な。
みんなそこに興味あるわけじゃないと思いますよ。
493:デフォルトの名無しさん
24/10/04 22:08:30.14 vLDssEdm.net
>>484
横からというか >460 書いた者だけど、あなたの疑問は解釈1の「アクションを受け取ってアクションを返す関数」だとざっくりし過ぎて納得いかないって感じでしょうか?
でしたら、解釈2では納得出来ませんでしょうか?
解釈2は、モナドの効能の一つに追加して「数学の世界にアウトソーシングという概念を持ち込む」というものです。
モナドの例えとして、床下配線というのがありますが、MaybeやListの様な通常のモナドも、>>=の中に関数適用部分を押し込んで、表から見えないようにしています。
(これも、見ようによってはアウトソーシングです。同じ数学の世界なので、隣の席に頼んだ感じですが)
IOモナドは、>>=の中すら見えない状態で関数適用しているわけですが、 >460 でも書いたとおり、「数学の外(ハードウェア)」で関数適用されていると考えるわけです。
IOモナドの>>= は、外の世界と遣り取りする受付窓口というわけですね。
(実際、バッファの様な振る舞いをします)
main = do x <- return 0
_________x <- return (x + 1)
_________print x
494:デフォルトの名無しさん
24/10/04 22:14:36.08 WSIC8Xt5.net
>>492
ラムダ計算も集合論上で展開されてるだろ
だから、Haskellも集合論の言葉で書かれてるじゃん
そんな誰もが分かってるけど、いちいち書いても何の得もないことを話したかったの?
495:デフォルトの名無しさん
24/10/04 22:16:42.74 vLDssEdm.net
この場合、IOモナドを使って変数xを書き換えているのではなく、シャドーイングによって同じxという名前の変数を新しく作って、古い x に +1 した値を束縛しています。
496:デフォルトの名無しさん
24/10/04 22:21:54.69 tixO3LDq.net
>>493
ごめんなさい。全然違う。入出力を題材にしているのはあくまで例で別に疑問はないです(実装をちゃんと知っているわけではないですが)。
モナドを導入する動機はMoggi論文読んだ読書感想文なので途中まで書いてますが、圏をなすかどうかです。
497:デフォルトの名無しさん
24/10/04 22:27:08.92 vLDssEdm.net
無理やりハードウェアも数学と言い張るなら、ハードウェアもチューリングマシンという計算モデルなので数学が元と言えなくはない?
そういうこじつけは置いておいても、IOモナドをアウトソーシングと考えると、じゃあ外の世界はめちゃくちゃか?と考えて、そうではないと気付く。
ハードウェアも一定の秩序がある。
数学だけが全てではないのかもしれない。
何かしらの秩序というか、法則性を持った世界(数学、数学以外含む)どうしのやり取りにモナドが橋渡しとして働いているのでは?とか、考えたりする。
498:デフォルトの名無しさん
24/10/04 22:28:17.05 tixO3LDq.net
>>494
モナドの原論文(Moggiの論文)の読書感想文を入出力の計算効果を題材に解説してみているんだって。
ブログに書いても今更突っ込むなんて恥ずかしいことができる人はいるわけないので、ここに書いている。
499:デフォルトの名無しさん
24/10/04 22:32:08.56 WSIC8Xt5.net
>>498
その人はHaskellは数学的に正当化されてないけしからんって言ってたの?
500:デフォルトの名無しさん
24/10/04 22:34:04.82 WSIC8Xt5.net
最低限、論文に書いてある正しいこととお前の妄想がはっきり区別できるように感想文を書けよ
501:デフォルトの名無しさん
24/10/04 22:44:05.60 tixO3LDq.net
>>499
はっきりそうは言ってない。
プログラムをλ項に対応させて単純化させると、valueからvalueへの全域関数となるけれど、
そう考えると、非停止性とか非決定性、副作用といった現実のプログラムにある特徴が失われる(だからそれを何とかしようと読める)。
>>500
そんなことできるほど力量ないです。
502:デフォルトの名無しさん
24/10/04 22:46:51.98 vLDssEdm.net
>>496
少なくともコマンド系のプログラムは圏をなしますね。
Haskellで作ると実感しますが、Haskellに限らず、
(ユーザーから見て)プログラムそのものが関数になります。
Linuxでコマンドをパイプライン処理するのは関数(射の)合成に相当しますし。
id相当のプログラムは作れますし。
・・・と考えると圏をなすと思うのですが。
(GUIプログラムもボタン単位とかで関数と言えますが、合成は…押した順序?)
例えば
{(x,2x+1) | x ∈ R} と 2x+1のグラフは同型だと直感的に分かりますが、その関数(射)は数式で表せません。
圏論では、可換図を受け取って可換図を返すとか出てきますので、{(x,2x+1) | x ∈ R} と 2x+1のグラフを結ぶ関数(射)が人間って言うのも有かな?とか、考えます。
(圏論では同型と分かれば(証明できれば)よくて、射の中身には言及しない)