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

1デフォルトの名無しさん
垢版 |
2021/12/17(金) 12:57:26.37ID:NPioGyUL
関数型プログラミング言語 Haskell について語るスレです。

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

前スレ
関数型プログラミング言語Haskell Part33
https://mevius.5ch.net/test/read.cgi/tech/1581326256/
2023/06/25(日) 14:43:47.12ID:H+Ij4nqZ
すいません、最後の行間違って修正前のやつコピペしました

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 )

です
よろしくお願い致します
2023/06/25(日) 15:08:12.64ID:CDxt6lPg
型クラスの単相性制限とか、関数従属性とか、とか。。。
的外れなこと言ってたらごめん。
2023/06/25(日) 15:23:50.61ID:CDxt6lPg
なんか Bard とかにつっこんでも情報得られるかも
2023/06/25(日) 17:33:31.79ID:OvK+yilq
ありがとうございます
現在まだ調べてる最中なんですけど

https://stackoverflow.com/questions/7198907/haskell-constraint-is-no-smaller-than-the-instance-head

によるとどうも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を使うとどうやらこうやら書いてあるんですけどなんのことやら
2023/07/03(月) 23:45:49.20ID:QPaqlNti
値とmoduleどっちも含んだdata作ればいいのでは
2023/07/04(火) 00:24:50.19ID:+0TfLuMN
>>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一個ずつ定義してとやればできるんでしょうけど、何が上手い逃げ道はないものかと
2023/07/04(火) 11:11:04.93ID:rN492ZrW
この記事では剰余環を作っているみたいだけど、参考にならないかな

https://qiita.com/gummycandy/items/9abca700eea7f46626e4
2023/07/06(木) 01:04:07.84ID:sds/6LG1
みなさん情報ありがとうございます
色々紹介していただいたソースとか自分で探してみた情報とかでまずは一区切りつける事にしました
こんな感じになりました
https://ideone.com/3Lhc4z
230デフォルトの名無しさん
垢版 |
2023/08/05(土) 13:07:07.29ID:1IOAcn45
hage
2023/09/04(月) 14:41:20.09ID:FcZAE9nJ
haskellは廃れてきてるな、悲しい
スペースリーク対応は難しすぎるしライブラリ類も最新のghcだと使えなかったりしてなんか
実用的な言語じゃないなって思う
xmonadなんかはほとんどBangPatternだよね
そういえば自動でstrictにする拡張が2個ぐらいあったけど追ってないどうなの
232デフォルトの名無しさん
垢版 |
2023/09/16(土) 21:21:50.35ID:6682wM15
数学の集合は普通順番を付けて書くと思うのですが(添字でアクセスできたほうが便利)
なぜ多くの言語では集合に順番がないのでしょうか?
233デフォルトの名無しさん
垢版 |
2023/09/16(土) 21:25:49.38ID:6682wM15
等価判定演算子では順番を問わないが、
記法としては順番によるインデックスアクセスもできる、が便利だと思うのですが

一番基礎的な集合の一つである自然数が順番を重視して扱うように大半の集合は順序を整頓して書かないと実用上不便ではないでしょうか?
2023/09/16(土) 23:06:28.20ID:XG1/1lYn
順番がないやつと順番があるやつは
なぜ対等な関係ではなく前者が一般的で後者が特殊だと言われるのか?

逆に、複素数はなんで虚部があるやつが一般的で虚部がないやつが特殊なのか?
235デフォルトの名無しさん
垢版 |
2023/09/16(土) 23:13:33.62ID:6682wM15
数学的概念として等価だったりどちらが特殊とか言えないのは納得しています

ただ、集合は順序を維持して記述するようにしたほうが明らかに認知的負荷が少なく、数学的記法でも多くの場合でそうなっていると思うのですが、
多くの言語で組み込み型の集合がそうなっていないのはどのような思想によるものでしょうか?という質問です
2023/09/17(日) 02:24:17.53ID:yNwKlKA6
データ型としての起源としては
素集合データ構造から始まっているようなので
素である(disjoint)ことがまず要求されて
他に集合という名前が使われていないことから
素で非順序的なデータ型のことを集合型と呼ぶことになった模様
2023/09/17(日) 02:39:39.55ID:XqeO/FaW
組み込み型とユーザー定義型の区別をなくす思想はある
最も正しいことを実現する思想ではなくミスをした場合の罪が軽くなる
2023/09/17(日) 23:47:13.96ID:70jB6wMR
初心者は++を使うけどなれたら<>を使ってる人が多い気がする
SemiGroupであれさえすれば使える<>を使った方が汎用的にかけるからかな
2023/09/18(月) 10:00:00.93ID:E5yF50jH
俗説が廃れるのは「時代が変われば正しさが変わるから」ではありません
俗説が正解だった時代などない
2023/09/19(火) 19:53:05.75ID:QCYT99dv
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で作ろうとしてるのですがバグがあるのでしょうか?
2023/09/19(火) 19:54:00.31ID:QCYT99dv
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で作ろうとしてるのですがバグがあるのでしょうか?
2023/09/19(火) 19:58:16.28ID:QCYT99dv
すみません、書き込むボタンの反応がなかったので連投になってしまいました
2023/09/19(火) 20:14:24.31ID:a563RtWW
touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ
2023/09/19(火) 20:14:45.64ID:a563RtWW
touchの本来の意味を考えれば、まあできなくてもそういうもんだなと思ふ
2023/09/19(火) 20:18:27.88ID:a563RtWW
ありゃ俺も連投しちまったすまん
なんか5ch重いっぽいね
2023/09/20(水) 08:38:40.03ID:I55f6i4N
for i in * ; do touch anotherdir/$i ; done
247デフォルトの名無しさん
垢版 |
2023/09/20(水) 08:53:25.46ID:I55f6i4N
>>246(bash)でお茶を濁した

perlが明日消えてなくなるらしいのでHaskellをPerlの代わりに使おうと思う
正規表現とグロブ、ファイル入出力はできた
他に何かあるかな
2023/09/22(金) 12:15:07.45ID:NjV4q9P3
数値のリスト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
2023/09/22(金) 13:06:36.18ID:8SLDLfd5
https://jutememo.blogspot.com/2008/06/haskell-join-listdata-intersperse.html
2023/09/22(金) 14:01:02.50ID:NjV4q9P3
putStrLn $ intercalate " " $ map show l
これでいけました
2023/09/22(金) 14:01:12.58ID:W8j4O+ex
泥臭いだけで罪があるかのように日常的に刷りこまれてるから
本当の有罪確定したやつは絶対許してもらえないよな
そりゃそうだよな
2023/09/27(水) 15:30:51.70ID:9Ywamwi5
{-# LANGUAGE BinaryLiterals #-}
この拡張をいれても
let t = read "0x111" :: Int -- 16進数にパースできる 273
let s = read "0b111" :: Int -- 2進数にはパースできない
微妙に不便だ
2023/09/27(水) 17:59:16.99ID:k7PwLxD8
readが定義されたモジュールは別のLANGUAGEってこと?
2023/10/11(水) 15:16:15.28ID:1pnnvG+R
groupBy (\a b -> snd a == snd b)
これを括弧を使わずにかけますか
groupBy ((==)<$>snd<*>snd)だと(a,b)->Boolとなって(a,b)->(c,d)->Boolとは型があいませんでした
2023/10/11(水) 17:39:54.48ID:Fikp0OWy
>>254
import Data.Function
groupBy ((==) `on` snd)

結局かっこは使うのだけど、これがあなたの求めるものでしょうか
2023/10/11(水) 22:05:36.63ID:1pnnvG+R
括弧を使わずにじゃなくてラムダを使わずにでした
まさに欲しかったのそれです
ありがとうございました!!
2023/10/18(水) 05:38:40.90ID:vCrdR6l9
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
2023/11/16(木) 18:41:54.01ID:wXoixzgD
岡部健、復活したよ!

エックス内を
“Ken140291“
で探してみて下さい。

最近登録したばかりの様です。
2023/11/18(土) 16:03:54.22ID:sLhTkQlu
自分で書き込んでいるのでは・・・。
2023/11/19(日) 15:31:44.23ID:/inwpH7b
>>248
init $ folfl (\a x -> a++[show x]++“ “) ““ [3,10,1] でOK
2023/11/20(月) 09:46:08.35ID:sZ0M6Dsh
>260 打ち間違えた!
lnlt$foldl(\a x->a ++show x++" ")[][1,10,3]
が正解。
2023/11/20(月) 14:32:44.66ID:4MiKC4cJ
>>258
ぎゃははははははは
2023/11/20(月) 21:45:30.49ID:Jf1v4QK8
https://github.com/ken-okabe/functional-programming-from-scratch-ja#before

> Unkown(気づいてない)

ウンコウンわろた。
2023/11/20(月) 23:57:47.37ID:N43MAaAU
スレチ
2023/11/21(火) 12:01:48.14ID:MS7pneIs
毛の壁くん復活してたのか!!
2023/11/21(火) 12:21:46.16ID:W0g+S6dW
https://archive.md/m7008

毛の壁(岡部健)についてはここが詳しい
2023/11/22(水) 15:27:17.26ID:1OepVPCl
こんなコードがあるのですが
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というのはどういう文法なのですか?
リスト内包表記でもないですし条件式の部分でモナドを扱ってるわけではないですよね?
2023/11/22(水) 16:31:30.12ID:PuIW3qrN
>>267
パターンガードかな
https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%BC%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)
2023/11/23(木) 07:24:43.49ID:WRBO39fy
<-はパターンガード修飾子と呼ぶのですね
初めて知りました
ありがとうございました
2023/11/24(金) 17:42:26.91ID:V3Fz2AWZ
毛の壁のTwitterの新しいアカウントは

Ken140291
FPFSstutorial
leadmove3648637

です!!
271デフォルトの名無しさん
垢版 |
2023/12/04(月) 12:27:24.28ID:GjmDAseS
>>270
ぎゃっはっはっはっはw
2024/01/01(月) 20:17:21.69ID:DcfOChZv
mapAccumL/Rの使いどころがよくわからないのですが
どういう時に使うとかの指針ってありますか?
273デフォルトの名無しさん
垢版 |
2024/01/09(火) 22:50:44.14ID:3mg8b04T
ここ5年で発売されたHaskellの書籍で最も優れたものを紹介してください
274デフォルトの名無しさん
垢版 |
2024/01/12(金) 10:55:28.35ID:cAhPSGjh
オワコン
2024/02/29(木) 01:38:01.78ID:d2gqoSk4
windowsにインストールできんみたいだなcabalがエラー?
まあwindowsでやるなってことだな
276デフォルトの名無しさん
垢版 |
2024/03/03(日) 23:47:35.89ID:9XAeTkis
モナドについて、床下配線に例えられたり、世界を受け取って副作用後の世界を返すと(IOモナドについて)語られたりするのが当時は分からなくて、考えた結果

何かから値を取り出し、関数適用して(その関数が)何かに値を戻す「動き」をモナドという。

って結論になっていたのだが、IOモナドも含めてもっと良い例えはないかと考えた結果、

モナドとは、アウトソーシング(外部依頼)を数学的に表現したもの。

という結論に至った。

アウトソーシング先が(数学の)外の世界だとIOモナドで、同じ数学の世界だとその他のモナド。

それならHaskell自身は「この関数実行しておいて~」って依頼出して結果を受け取るだけだから、
副作用はないと言う主張に矛盾はない(のか?)
(もしくは、IOモナドはHaskellが受け取れる形の値を返すような入出力の「マシン語」を返してる?)

そう考えると、数学が「数学の外とのやり取り」という概念を獲得したと思うと凄い。
2024/03/04(月) 00:46:59.53ID:XMYw3zR0
箱の中に処理したいデータが入ってるけど一緒にIOウイルスも入ってて
普通に箱を開けるとIOウイルスが外界に漏れて困るから
もう一回り大きい箱を用意してその中に箱とデータ処理装置を入れて
密封した上で内側の箱を開けてデータを処理する

そうすると箱の中に処理されたデータとIOウイルスが入った状態になる
これを延々と繰り返すのがIOモナド

ずっと前に毒ガスで考えた比喩だけど最近だとこっちだな
278デフォルトの名無しさん
垢版 |
2024/03/04(月) 01:02:22.82ID:vyClhVzf
ふーむ。
仮にアセンブラと1対1に対応したCの関数を全部Haskellから呼べるようにすると、出来ちゃうわけで。
(do形式だとまるっきりアセンブラコードに見えるHaskellコードの出来上がり)

そう考えて私のアウトソーシング説が出来た感じですね。
Haskellがモナドを採用したのは数学(関数型言語だったっけ?)の敗北ってどっかで読みましたし。
2024/03/04(月) 01:22:40.61ID:XMYw3zR0
doの場合は1行ごとに新しい箱が作られてる
順序はたまに前後するけど内側の箱のデータは外側の箱でしか使えないから
必要な順序は保証される

外界の予測不能な状態を全部1つの箱の中に押し込んで
箱の外側の処理装置製造工場は全部予測可能(純粋)にしてる感じ

数学の敗北の意味はよく分からないけど
実用性のために予測不能な状態を持ち込んだことかな
2024/03/06(水) 10:29:39.18ID:Yy7OLBEk
なんか大げさな例えを使いたがるやつが増えたなぁ
コーディングの上でなんの役に立つんだが
2024/03/06(水) 15:29:14.97ID:soRPwZI7
「末尾呼び出ししたい関数をデータコンストラクタで置き換える」という仮説は役に立つけれども
(>>=)はコンストラクタではないという事実を見ただけで仮説を捨ててしまうことは科学的によくあること
282デフォルトの名無しさん
垢版 |
2024/04/10(水) 04:46:37.45ID:+L19CyUd
WindowsでghcupをインストールするのにWSLが不要になって
PowerShellだけで導入できるようになってる
2024/04/13(土) 09:43:59.70ID:p3ysjEUv
rustスレで知ったけどhaskellを正格にして依存型を入れたidris(idris2)つー言語があるんだな
2024/04/13(土) 10:37:58.47ID:VEwLcqlL
idrisまで興味があるのならHaskell/Elm/Rust/Zigの流れで開発されているRoc-langも見ておくと良い
特にstatic reference counting周り
2024/04/13(土) 22:46:49.50ID:p3ysjEUv
色々知らないのがあった、ありがとう
static reference countingつーのが流行りなの
最近のhaskellもrustみたいな1回しかつかえない線形型(linera haskell?)が導入されてるね
286デフォルトの名無しさん
垢版 |
2024/04/14(日) 08:32:57.22ID:ZXz6cRZI
IOモナドの入力関数も、引数のない関数=変数と捉えると、実質線形型と同じ。

let x = 0 in return (x + 1) >>= x -> print x

こうすると変数xはシャドーイングによって同名の別の変数が生成される。

getLineとかの入力関数はHaskell(数学)の外で初期化される変数とも考えられる。
2024/05/17(金) 10:56:06.61ID:kEVlBeR0
参照カウントは0になれば即座にデストラクタを呼び出す
つまり呼び出しを遅延しない
正格にすることと参照カウントを入れることは実質的に同じこと
2024/05/18(土) 22:55:12.58ID:HEnIptqp
cabalのバージョン上がってたので
windowsで試したらちゃんと動いたわ
気にかけてくれてたんやな
2024/06/11(火) 20:46:47.08ID:zqrBHeqN
IOモナドを拡張して、副作用をDBだけに限定したモナドとか作れないの?
290デフォルトの名無しさん
垢版 |
2024/06/20(木) 02:22:58.45ID:s4SRXQdp
いつの間にかHaskellがC#より速くなってた…。
https://nshinchan01.hateblo.jp/entry/2024/06/20/021327
291デフォルトの名無しさん
垢版 |
2024/06/23(日) 11:34:59.09ID:1+Xj+JzS
すみません
GHCのWindows11対応についての質問ですが
「9.2」以前のGHCはWindows11をサポートしていないとの事ですが

ttps://gitlab.haskell.org/ghc/ghc/-/wikis/platforms/windows

これはプログラムコンパイルをして
アプリケーションを生成できないだけで
コンソール内での実行や学習をする分には
「9.2」以前のGHCでも問題ないとの認識で大丈夫でしょうか。

ライブラリが9.0に対応していない物があり確認したいです。
2024/06/23(日) 21:13:21.29ID:1+Xj+JzS
度々すみません。

GHCのWindows11対応についての質問の件
Windows11機にGHC8.xをインストールして試した所

問題なくコンソールから実行して
結果のデータファイル生成できました。

取り敢えずはこれでやってみます。
2024/07/03(水) 21:32:31.40ID:FVo2vRsM
Functorってf : value -> valueの関数をfmap f : computation -> computationの関数に拡張してあれこれするけど、
そもそもvalue -> value関数がいらなくない?

わざわざvalue とcomputationを区別するから難しくなるのであって、
全部Functor適用した体で computation -> computationの拡張関数だけ使うように
設計しなおせばもっと普及するんじゃない?
2024/07/03(水) 23:29:27.98ID:XPii5wC3
何を言っとるんじゃw
2024/07/04(木) 00:05:21.90ID:CIK9cQRa
computationにしたら理論的にカプセル化されるから、例えばT computationで専用に作った関数はU computationでは使いまわしできない。
だから一般的にvalue -> valueで作ることでT computationでもU computationでも使いまわしできるようにしてるというのはわかる。

でも、そういうところが使いにくくて普及してないんじゃないかと思うから、T computationで専用で作った関数も特に何もせず
U computationの関数として使えるようになったらもっと使いやすくなると思う。

というかHaskellにはcomputationの概念は百害あって一利なしなんじゃまいか。
2024/07/04(木) 14:17:13.04ID:PVQ//B0J
>>295
君の言うcomputationってどういう定義?
2024/07/04(木) 19:36:46.28ID:CIK9cQRa
しらんがな。
一応マジレスすると、valueと似ているけどなんか違いがあるもの、ぐらいだろう。

自分の意図としては、”計算機”上で生成されたデータ。
計算機というのは電子計算機に限定されない。
電卓でもいいし、そろばんでもいいし、計算するときのもととなる
数の表現とかをcomputationと呼んでも差し支えないと思ってる。

たとえば、
value:27
に対して電子計算機上だと
11011(2)
で表現されるものがcomputation。

そろばんだったらそろばんの玉の配置。
計算してパチパチ音が出るのが副作用。

逆に言うとvalueの方がわかり難いと思う。計算している計算機の外の世界の
何か数的データみたいな感じがしてわざわざそんな区別いるか?と思う。
2024/07/04(木) 23:38:08.08ID:iUDrYol2
>>297
computationはvalueの一つ
`5 + 3`がcomputation
`Just 8`もcomputation
2024/07/05(金) 00:05:27.16ID:b38yqPqv
>>298
computationがvalueの一つだったら
概念的に computation ⊆ value
になるけど。
少なくとも拡張しているのだから
computation ⊇ value
にならないとおかしくない?

`5 + 3`がcomputationというのは前提にもよるからなんとも言えないと思う。
計算して8(=5+3)を導いたなら8はcomputationだと思うが。
たとえば、掛け算だったとして、九九を唱えてゴサンジュウゴで15を導き出したんなら計算してないからvalueだと思う。
2024/07/05(金) 00:53:37.68ID:DkqpNxkH
>>299
おかしくないよ
OOPでクラスAを継承してクラスBを作った場合(B extends A)を考えてみたら?

`九九を唱えてゴサンジュウゴの結果を導き出す`のがcomputation
導き出された結果と導き出す計算を区別して
2024/07/05(金) 02:03:56.64ID:b38yqPqv
やっぱりHaskellスレにcomputationネタわかる人いたんだね。

>>300
>OOPでクラスAを継承してクラスBを作った場合(B extends A)を考えてみたら?
ここは納得。

>導き出された結果と導き出す計算を区別して

なにか f: value -> computation型の関数を念頭に置いて
`f ()`はcomputationと言っているのでは?

意図を勘違いしているかもしれないですが、computationはあくまで導き出された結果でしょう。
それと、関数の返り値を導き出す計算をするにあたって出てくる効果を定義に含めようとしているように感じたのですが、
それはあくまで value -> computation型の関数を計算することに付随する性質であって
computation概念そのものじゃないと思うのですが。
あくまでcomputation概念自体はそういう関数を計算して得られた計算結果なんじゃないですかね。
そう考えると何か不都合な例とかあります?
302デフォルトの名無しさん
垢版 |
2024/07/25(木) 23:56:39.51ID:zdgCFOr2
stateやioモナドってHaskell以外でも使われてるの?
maybeやeitherは関数型でない言語でも同等のものがあるから分かるけど、stateやioはいまいち便利そうな感じがしない
303デフォルトの名無しさん
垢版 |
2024/07/26(金) 05:41:42.96ID:JmafwQnp
>>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デフォルトの名無しさん
垢版 |
2024/07/26(金) 05:47:41.29ID:JmafwQnp
そこまで気づくと、Gtk2hsとかWin32とかのC/C++からのラッパーライブラリを関数型言語っぽくない!って拒否する気持ちが分からなくなる。
305デフォルトの名無しさん
垢版 |
2024/07/26(金) 06:16:02.54ID:JmafwQnp
あ、IOモナドの利点一応あった。
入力関数が他の関数の引数になったり、他の関数に関数合成出来ない。
Pythonのprint(input())みたいなコードや、len(input())みたいなコードは無理。
ここをしっかり分けることで、そういう変な使い方でのエラーは出ない。

もっと広い視点で言えば、入出力がIOモナドという型で分かれているのでネストの深いループの中でも入出力時に型を意識する必要があるので、そういうバグが大分減る。

手続き型関数型関係なく、ネストの深いループの中のデータが今どんな状態かを頭の中で把握出来る人はそう多くない。

だから、デバッグ時に解きほぐしていくんだが、関数型の方が切り分けしやすいかも?
2024/07/26(金) 06:20:50.81ID:EERDttnJ
Halkellのその先が見たい?
Rustにその答えが全て詰まっている
307デフォルトの名無しさん
垢版 |
2024/07/26(金) 08:11:21.54ID:3P5OnSpM
どなたか教えてください。
数学の構成や命題の証明に使うならば、HaskellとOCamlはどちらがよいでしょうか。
2024/07/26(金) 12:15:47.14ID:f34zQmtT
Rustは、メモリが見えすぎるのがイヤだー
大したもの書かないから、GCありでお願いしたい
2024/07/26(金) 17:24:09.33ID:HoH4md/R
>>307
漠然としすぎ
やり直し
2024/07/26(金) 17:58:43.47ID:dth0vnjc
数学の構成?
311デフォルトの名無しさん
垢版 |
2024/07/27(土) 00:29:15.86ID:r3Qeb3es
>>307
Coqという証明支援プログラミング言語をお使い下さい。

Haskellでも型プログラミングでゴリゴリ自力で命題の証明出来るそうですが、ある程度自動化されている専用言語の方が良いでしょう。
Coqはその中でも日本語情報が多いです。
312デフォルトの名無しさん
垢版 |
2024/07/27(土) 00:43:27.29ID:r3Qeb3es
>>306
実用言語、特に組み込み分野を置き換えるのに期待されてる。
特集記事が無くてもお題スレ見たいな、Rustで問題を解こう的な連載が続いてる辺り、
特にinterfaceの編集陣の熱量は感じる。

Haskellも先駆者の記事によればWeb向けとしては神言語だそうだ。
ただ、周辺環境が未整備なだけで。
(なので、自分で全部作るという茨の道を進む「覚悟」が必要だとか)
未だにそうではないことを祈るが…。
313デフォルトの名無しさん
垢版 |
2024/07/27(土) 00:53:19.48ID:r3Qeb3es
>>307
数の構成の方は、代数的型と基本的な方だと(一部)derivingで自動生成してもらえるから、Haskellはとても楽。
print関数で表示する部分だけでも自動生成してもらう価値はある。
(Read,Enum,Ordで生成されるのは確認済み)

data Nat = Zero | Succ Nat deriving (Show)

連続関数はPCそのものの限界で無理。
代数的型でメモリの続く限りの範囲なら少数も作れるかもしれない。
(その前にリストなり何なりで10進数位取り記法を導入しないと、Natは無限進数なので小数点第1位が1万とか、無限に桁上がりしない構造になる)
2024/07/27(土) 13:46:44.73ID:f/jP9uGd
>>307
結局こいつがなんの返信もしてない時点で適当に書き込んでたってことがわかるよ
真面目に相手をしないほうがいい
315デフォルトの名無しさん
垢版 |
2024/07/27(土) 16:19:23.58ID:Z663WedI
>>313
ありがとうございます。
2024/07/27(土) 17:29:46.87ID:sW1zoNGb
>>311-313>>314は同一人物だよ
騙されないで
2024/07/27(土) 21:26:10.11ID:wvv58UYW
知ってた
318デフォルトの名無しさん
垢版 |
2024/07/27(土) 23:34:35.07ID:r3Qeb3es
>>316
他人を語ったつもりもないけどね?(ID見れば分かるんだし)
ちなみに>303-305も私だ。

1日2-3回くらいしか見に来ないから、書き込めることはまとめて書き込んだ結果です。
2024/08/01(木) 12:24:32.72ID:XzWUPxYY
プロセッサメーカはAIブームと見るやこぞってAI処理特化プロセッサの開発競争
関数型言語に特徴的な処理に特化したプロセッサは誰も作ってくれない
2024/08/01(木) 16:36:21.75ID:rWBa8MOA
それ必要か?
321デフォルトの名無しさん
垢版 |
2024/08/04(日) 23:21:47.06ID:y1wQ9MUm
>>319
スタックコンピューターは、Lispの時にぽしゃった。
2024/08/05(月) 21:33:27.17ID:FcOscapW
日本企業がLisp専用マシン作ったが第五世代コンピュータプロジェクトが💩で何らまともな成果をあげられなかったからね。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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