関数型プログラミング言語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/
2020/04/29(水) 10:44:15.44ID:JIRjVKl2
奴は四天王の中でも最弱
2020/04/29(水) 10:47:45.94ID:SPs1sTfW
5chごときにスレが立たないとは
魔族の面汚しよ・・・
2020/04/29(水) 15:25:39.64ID:Cpi+Il5+
>>288
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、
ruby 2.6.6, node 12.16.2 を入れた

yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。
これは、#!/bin/sh で始まるシェルスクリプト

Windows側で、VSCode の拡張機能、Remote WSLも使う

Haskell のhsenv は、使えないのか?
299298
垢版 |
2020/04/29(水) 15:39:17.08ID:Cpi+Il5+
ちなみに、Ruby on Rails の場合、コンパイルに必要なパッケージは、

sudo apt-get update
してから、

sudo apt install -y build-essential

build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています

次に、openssl, readline, zlib のパッケージをインストールします。
sudo apt-get install -y libssl-dev libreadline-dev zlib1g-dev

データベースの、libsqlite3-dev, sqlite3 をインストールします。
sudo apt-get install -y libsqlite3-dev sqlite3
2020/04/29(水) 15:47:47.21ID:ob+X7Nc0
的はずれなのでやめて
2020/04/29(水) 15:50:08.55ID:l6fPvkOQ
-lgmpができないならlibgmp-devをインストールすればいい
2020/04/30(木) 17:28:15.60
>>298-299
んにゃぴ・・・んまぁ、そう、よくわかんなかったです

>>300
それでようやく原因が判りました
Stack no longer supports Cabal versions below 1.19.2,
but version 1.18.1.5 was found.
This invocation will most likely fail.
To fix this, either use an older version of Stack or a newer resolver
Acceptable resolvers: lts-3.0/nightly-2015-05-05 or later
stack will use a sandboxed GHC it installed
For more information on paths, see 'stack path' and 'stack exec env'
To use this GHC and packages outside of a project, consider using:
stack ghc, stack ghci, stack runghc, or stack exec

7.8.4 のCabal は 1.18.1.5 であるんですが、最新版 stack は 1.19.2 以降のCabal しか対応しない
というわけで諦めました。いうほど 7.8.4 使いたいかって気分になってきて、エラー出たらその都度古いコードに書き直せばいいじゃんってなったんで
このイシューは閉じます。ありがとうございました。
2020/04/30(木) 17:28:45.70
>>300じゃなくて>>301だった
2020/05/02(土) 07:49:02.53ID:+q7QtdZF
cabalってカバルじゃなくカボールなんだな
2020/05/02(土) 09:29:59.76ID:S0jsNVj+
haskellのライブラリ管理ツールはずっとクソ。
pythonのも大概だけど、haskellはそれを遥かに凌ぐレベルでくそ。
2020/05/02(土) 12:12:56.17ID:2Bfib/9h
そろそろocamlの時代じゃねーか?
2020/05/02(土) 12:50:23.34ID:F6qz2woZ
ライブラリ管理ツールって何をするためのモノなんだ?
ユーザーから何を期待されてるんだ?
2020/05/02(土) 13:54:24.62ID:QDKxMZyf
シェルスクリプトで管理ではなく
そろそろxmlとかyamlとかの時代を期待されてる説
2020/05/04(月) 03:20:08.08ID:tNWuxt0H
待ち遠しい「Algorithm Design withHaskell」
https://www.cambridge.org/core/books/algorithm-design-with-haskell/824BE0319E3762CE8BA5B1D91EEA3F52
310デフォルトの名無しさん
垢版 |
2020/05/04(月) 16:45:39.46ID:R0S0SfqY
ocamlはせっかく盛り返してたのに失言でだいなし
2020/05/04(月) 23:50:02.51ID:Qeb7CV4E
どんな失言?
2020/05/05(火) 13:49:22.34ID:jdwgKTKz
haskellにライブラリ管理ツールなんて無いよね?
2020/05/06(水) 22:37:05.49ID:wUeYrIi1
釧路湿原
2020/05/07(木) 10:57:00.07ID:zCrpEpjK
書籍「関数プログラミング 珠玉のアルゴリズムデザイン」で分からない所があります。

2ページ目3行目
xsに含まれない最小の数は、filter (<= n) xs に含まれない最小の数ということになる。

ここで < ではなく、<= なのは何故でしょうか。
< を使って条件を厳しくしても、

xs = [0], n = 1 ===> filter (<n) xs = [0]
  [0] に含まれない最小数 = 1
xs = [1], n = 1 ===> filter (<n) xs = []
  [] に含まれない最小数 = 0

このように問題無いように思えます。
2020/05/07(木) 16:47:46.68ID:/pjDMUqX
事実を述べているだけに見えるが
何故あの事実ではなくこの事実を切り取ったのかを知りたがるのが面白い
2020/05/07(木) 17:22:10.29ID:mCGt79kv
>>314
その直前に

[0..(length xs)] の範囲にある数の少なくとも1つはxsに含まれていない

とあるので(鳩の巣原理)、その自然な帰結として

length xs より大きい数は、たとえxsに含まれていたとしても探索の対象にする必要はない

ということで filter (<= n) xs (where n = length xs) が出てくるのだと思う
そこで filter (<n) xs では意味がわからない(自明ではない)
2020/05/08(金) 15:02:16.95ID:H/a69LIv
仕事でhaskell使ってる人いる?
318デフォルトの名無しさん
垢版 |
2020/05/08(金) 17:29:16.16ID:3cwUCrUk
>>309
表紙すごい買う気失わせる感じだけどほしいな
かむbりぷbのだーたアルゴリは名著多いし面白いのだといいな(´・ω・`)
2020/05/08(金) 18:31:16.41ID:HMlJY84s
>>317
使ってないけど、富士通かな?
川崎の案件で募集してたぞ。
2020/05/09(土) 06:20:07.12ID:djQF9o2a
>>319
金融系?
2020/05/10(日) 01:20:32.76ID:nxDhOjOb
>>316
理解できました。
ありがとうございました。
2020/05/22(金) 10:43:13.79ID:9QfQmUEB
https://wiki.haskell.org/Pronunciation
>Below are some notes for beginners on how to pronounce those strange Haskell operators and 'read' Haskell programs.

>>317
https://mevius.5ch.net/test/read.cgi/tech/1548720347/925-
2020/05/23(土) 00:35:45.46ID:PUmkxvlF
次のように、一つのモナドを遅延的に無限に評価できる関数 repM は定義できるでしょうか?

repM :: (Monad) => m a -> m [a]

xs <- repM (return 1)
print $ take 3 xs -- [1, 1, 1]

ys <- take 2 <$> repM (return 1)
print ys -- [1, 1]
2020/05/23(土) 01:33:43.85ID:m+h1wlWJ
>>323
コレは?

repMsub x = return(repeat x)
repM x = x>>=repMsub

main = do
xs<-repM (return 1)
print $ take 3 xs
2020/05/23(土) 01:44:01.25ID:m+h1wlWJ
あ、コッチの方がかっこいいのか?
でも可読性を犠牲にしだすとperlみたいになるから良くない?

repM = (>>=(return.repeat))
2020/05/23(土) 01:56:13.86ID:PUmkxvlF
>>324
>>325
それはひとつのモナドを3回評価しているのではなく、
ひとつのモナドの中の値を3回評価しているのではないでしょうか?

例えば repM (getLine >>= print) を評価すると、
1回しか getLine >>= print を評価しません。

ちなみに、IOモナドに限れば unsafeInterleaveIO 関数が使えます。
また、リストではなくいわゆるストリームなら出来ました。
ですが今はモナド全般に適用でき、リストのモナドを返す関数を求めています。
2020/05/23(土) 02:01:15.20ID:PUmkxvlF
>>324
すいません。
補足です。

a <- take 3 <$> repM (getLine >>= print) を評価すれば、
3回の副作用 getLine >>= print が実行され、
a は [(), (), ()] を束縛していて欲しいのです。
2020/05/23(土) 12:08:02.84ID:eKnPDQS2
module Main where

import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Trans (lift)
import Data.Conduit (ConduitT, runConduit, yield, (.|))
import qualified Data.Conduit.List as CL

repIO :: (Monad m, MonadIO m) => IO () -> ConduitT () () m ()
repIO io = do
x <- liftIO io
yield x >> repIO io

repM :: Monad m => m o -> ConduitT i o m r
repM m = do
x <- lift m
yield x >> repM m

main :: IO ()
main = do
x1 <- runConduit $ repIO (getLine >>= print) .| CL.take 3
print x1 -- [(),(),()]
x2 <- runConduit $ repM (getLine >>= print) .| CL.take 3
print x2 -- [(),(),()]
let x3 = runConduit $ repM [1,2] .| CL.take 3
print x3 -- [[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2]]
let x4 = runConduit $ repM [] .| CL.take 3
print (x4 :: [[Int]]) -- []
let x5 = runConduit $ repM (Just 1) .| CL.take 3
print x5 -- Just [1,1,1]
let x6 = runConduit $ repM Nothing .| CL.take 3
print (x6 :: Maybe [Int]) -- Nothing
2020/05/23(土) 13:15:18.54ID:eKnPDQS2
あ、ストリームでできたってこういうことか
2020/05/24(日) 19:39:02.80ID:A0PpU4F1
HaskellのフレームワークってGHC拡張たくさん使われてるから、基本的な文法だけ知ってても、エラーが出たら意味分からなくなるという初心者泣かせな言語だな。地道にコツコツ知らないことを勉強してってるわ。
使いこなしてる人ホンマ羨ましい。
2020/05/24(日) 22:41:15.23ID:oexHBYog
The state of GHC on ARM
https://www.haskell.org/ghc/blog/20200515-ghc-on-arm.html
332デフォルトの名無しさん
垢版 |
2020/05/25(月) 14:19:28.47ID:HRWjfAZ+
>>330
そういう悪い所を悪いと言えないのが初心者で
初心者の甘い評価がなければ持続不可能なのがGHCじゃないか
2020/05/25(月) 19:07:59.38ID:b4izxg0D
むしろ俺は段階的に学べていいと思ったが
2020/05/26(火) 13:27:47.52ID:w7oGlmub
haskellのフレームワークとやらが具体的に何を指しているのか分からん。
YesodやServantなどのWebフレームワークしか思いつかんが。

いずれにしても、そもそも初心者がフレームワークに頼るべきではない。
初心者を抜けて、さぁ本格的なアプリでも作ってみるかとなった時に使えばいい。

初心者は15パズルやTODOツールみたいな簡単なアプリをフルスクラッチで作ってみて、
言語拡張の必要性や、有用なライブラリの使い方を少しずつ学ぶことを奨める。
2020/05/27(水) 11:14:49.47ID:xJStjlCD
そういうのはつまらんのだよ
2020/05/27(水) 13:16:13.81ID:SIsgBJ88
>>335
初心者が面白いと思える学べる題材ってなんかあるかな?

C#だとゲームとかGUIとか簡単なのになぁ
Pythonだって色々思い浮かぶのに
2020/05/27(水) 17:32:08.93ID:Ro2X8Fae
プロジェクトオイラーでもやったら
2020/05/29(金) 00:14:38.34ID:Hx2r4buk
haskell興味あるのですがhaskellの長所と短所ってなんですかる
2020/05/29(金) 00:57:51.48
若さと情熱に身を任せたいなら C、衰えても続けたいなら Haskell
2020/05/29(金) 07:22:48.07ID:mJaFRwIH
GoとRustが無かった時代には長所がいっぱいあったんだろう
もし、その時代のコードを変更することなく今使えるならそれも長所だが
2020/05/29(金) 07:54:35.82ID:7l9AMad4
>>338
長所は難しいことをより難しく書けること
短所は簡単なことでも難しく書かざるを得ないこと

本質的に純粋関数だけじゃリリースできないことも大問題ではある
切り分けで対処しても破壊を含むコードは必ず走る
理想が現実に敗北したような体系だから手を出さないほうがいいよ
2020/05/29(金) 08:30:23.80ID:wwuYcwOw
>>338
長所は、宣言的に分かりやすく書いたプログラムが意図通りにちゃんと動くことです。
何をするのかと、どのようにするのか、この二者をきっちり分けてプログラムできるのがHaskellの大きな魅力です。
(できると言っても、初心者が簡単にできることではありません。 その方向に正しく精進する必要があります。)

短所は、少し上のレスでも言及されていますが、入門を抜けた後に何に取り組めば良いのか分からなくなることです。
始めから何か目的があってHaskellを学び始めたのでしたら良いのですが、そうでなければ、
魅力的な題材の無さに愕然とし、路頭に迷うことになるでしょう。
実はgithub等を漁れば先輩方の様々はジャンルの非常に参考になるプログラムを数多く拝見でき、
自分も取り組んでみたくなる題材がたくさん見つかるのですが、逆に言えばそうやって努力して探さないと見つかりません。
2020/05/29(金) 09:57:17.22ID:zRWEM9Qa
>>341
後半、そういう批判よくあるけど毎回何言ってんのかよくわからん
お前達は何を批判してるの?
2020/05/29(金) 10:24:25.66ID:mJaFRwIH
過激派と思ってた奴に中道の仕事を奪われる
理論的にありえないと思っていた中道と中道の対立が現実になる
2020/05/29(金) 11:22:41.66ID:xO3kN7Ry
どんなに多くの短所があろうが
それらに勝る長所が一つあれば好きになる

人でもプログラミング言語でも
346デフォルトの名無しさん
垢版 |
2020/05/29(金) 11:35:07.26ID:OBuVVMWP
>>338
Haskellに対して懐疑的だった初学者がParsec使ってパーサー書いてみた感じだと

長所
バグ皆無のパーサーをBNFを書き写すように簡潔に書ける
(自分はCやrubyでは書けなかった)
問題に応じて言語内言語を作れるので、コードの量を極めて少なくできる
短所
yaccやbisonより学ぶのにかなり時間がかかりそう
言語内言語を作れてしまうので、ぱっと見ただけではコードを理解できない
(数式を理解するには記号の意味を理解している必要があるのと同じ)

yaccやbisonを使った経験は無い
だが、Haskellの方が応用が利き問題の解決の仕方が美しいので学びたいとは思わなくなった

解決したい具体的な問題があり、自分が学んできた言語だとコードが大きく複雑になりそうで、新しい概念を学ぶ余裕と覚悟があるなら良いと思う
ただ便利そうなのを探してるとか興味があるってだけだと挫折するかも
Haskellを参考にしたより新しい言語を学ぶ方がスマートかもしれない
自分みたいにHaskellに懐疑的で徹底的に学んで悪口書いてやろうと思っているならマジお勧めwww
2020/05/30(土) 19:36:21.64ID:/U1uledC
>>338
長所: 多くのバグをコンパイル時に潰せる
短所: 手続き型プログラミングにおける既知の資産(アルゴリズムなど)が活用しにくい
2020/06/01(月) 05:07:50.77ID:seoK/8uJ
Ocamlを使わないといけなくなっていじり始めたけど、あれもこれも出来なくて不便だな
やたら冗長になるし…
349デフォルトの名無しさん
垢版 |
2020/06/01(月) 07:39:57.03ID:L1Mt0gVE
書くのが不便になる代わりに、ぱっと見ただけで理解できるコードになる
という軍師の言葉をぱっと見ただけで信じる者だけがOCamlを使いなさい
2020/06/01(月) 08:15:03.48ID:dkkr+KCk
>>348
できないことの例を教えてください
2020/06/02(火) 01:46:24.39ID:UWOmEsh4
>>328
>>329
やはり純粋なリストだけでは望む仕組みは作れないという結論に達しました。

逆に言えば、そういう事が容易にできるのがストリームの利点の一つなのだと理解しました。

ありがとうございました。
2020/06/05(金) 23:44:13.56ID:aqmhehrv
memptyってなんでmunitやmidとかじゃないんだろうな?
emptyの心がよーわからん

文字列のように意味的に空なモノイドもあるが、
空じゃない例の方が圧倒的に多く一般的じゃないか?

ま、どうでもいいんだけどな
2020/06/06(土) 08:31:53.87
let nop = mempty in ...ってやってる(嘘)
2020/06/10(水) 18:32:52.39ID:vPvQB3B1
top level の型の指定についての質問です。
haskellのルールでtop levelでないところでは曖昧な型で型推論してくれて通るけど、top levelでは一意に型が決まらないとダメとかなんとかそういうルールがあって、
それでハマって苦労した記憶があるんですが、今その事ふっと思い出したんですが、詳しい内容が思い出せません。

haskell ambiguous top level

とかでグクってもそれらしい話しが出てこないんですけど、なんか思い当たる方おられませんか?
2020/06/11(木) 20:57:26.28ID:h7Wncfkb
>>354
どういうことか、何か例を挙げることはできますか?
2020/06/11(木) 23:57:59.62ID:oU50Re4d
>>355
レスありがとうございます。
当時なんかのプログラム組んでてハマったんですが、どんな例だったかは思い出せません。
しかし制限の名前はわかりました。
monomorphic restriction (単相性制限) という奴でした。
ググってみると多相性を無制限に認めてしまうとメモ化の実装が難しくなるようで性能に影響してしまう事を避けるための制限のようです。
こまめに型宣言書くようにするか、性能を犠牲にしてもよいなら制限をなくすオプションとかもghcとかには用意されてるので実害は無いんですけど、昔ハマって原因突き止めるのにエライ苦労したのでなんだったかふっと気になってお聞きしました。
お騒がせしました。
2020/06/12(金) 03:07:06.96ID:YpUxhodA
>>356
いえ、お気になさらず。
こちらも勉強になりました。
2020/06/20(土) 10:17:27.94ID:6v+H5Lhm
今、最新のghcでdependent typesは使えますか?
2020/06/23(火) 00:33:49.50ID:2ZCsz0wY
次の2つの関数の型の違いを説明していただけないでしょうか。

f :: C a => T a -> b -> b
g :: T a -> (C a => b) -> b

関数gのようなconstraintの使い方にはこのような効果や意味がある、
とはっきり説明できず、モヤモヤしています。

また、このようなconstraintの使い方には特別な用語があるのでしょうか。
webで検索して調べてはいますが、適切なキーワードが思いつかず、苦労しています。
2020/06/27(土) 16:04:56.51ID:FJC3hMrg
Haskell用語だけでは説明できない気がする
C++用語で
a -> bのaとbはtemplateを実体化する引数
C a => bはtemplateの宣言であって実体化ではないのでgは意味がわからない
2020/06/28(日) 01:53:39.90
Steamで買えるHaskell製ゲームを教えて
2020/06/28(日) 10:31:17.77ID:hu4PmWPn
>>360
レスありがとうございます。

すいません、C++に精通していないため、templateの実体化や宣言の意味がよく分かりません。

件の関数型は次のブログにありました。
Introduction to Singletons (Part 1)
https://blog.jle.im/entry/introduction-to-singletons-1.html#going-backwards
ここの Going backwards の節です。
(昔、別のWebページでも見て、その時も不思議に思っていたのですが、どこのページだったか忘れてしまいました)

そこでは
withSingDSI :: SingDS s -> (SingDSI s => r) -> r
という型です。

確かに SingDSI s => のconstraintを外すと、この関数を呼び出すところで型エラーとなってコンパイルできません。
代わりに、型シグネチャの先頭に SingDSI s => を書いたとしても、です。
しかし、なぜ型が合わないのか理由が分かりません。

何かしらの意味があるはずなのですが・・・
2020/06/29(月) 23:47:59.12ID:MeiET0BU
>>362
のリンク先の話は中々勉強になるなぁ。
自分でこんなの使いこなせるようになるとは思えないけど。
2020/07/02(木) 23:40:38.85ID:Rg/xVuvf
>>359
Haskell勉強中で答えられるほどの知識無いけど
constraintの意味から察するに、右の引数の型が正格評価されていないうちには受け入れないということでは
遅延的に型を選択して返すような関数は作れるけど、それを明示せずに正格評価の関数に渡せてしまうと追跡困難になる
引数の型を決定しておかないと渡せないようになってるんじゃないかな
つまり、前者は第一引数の型を指定してて、後者は第二引数の型を指定しているというだけだと思う
知らんけど
365デフォルトの名無しさん
垢版 |
2020/07/04(土) 23:44:16.95ID:LjgILXlp
すごいブログを見てしまった後では気が引けるが、前に書いた随伴をhtmlにした
[デフォルトの名無しさん](https://pastebin.com/WTvqXjnT)
なんか動いているな、程度の確認しかしていないのでバギーだと思う
サイズが大きいけどほとんどがcss
パット見、jsは、require, jquery, mathjaxぐらい
実行環境はihaskell
2020/07/27(月) 22:40:30.17ID:XpS4ozgV
遅延評価のありがたみよくわからんかったけど
なんとなく分かった

使うか使わない情報、ひとまとめに定義したいんだけど
使わないのなら、情報取りに行くだけ無駄

でも、遅延評価なら、無駄と思える情報も定義できる
なぜなら、使って初めて情報を取りに行くのだから
なるほどね と思った
2020/07/27(月) 22:51:22.29ID:u9oz0ryS
有名人だらけで楽しみですな。
https://haskell.love/
368デフォルトの名無しさん
垢版 |
2020/08/13(木) 17:57:45.06ID:AeuuY+wz
圏論入門 Haskellで計算する具体例から
雪田修一 (単行本)
という本が近々出るので、Haskellの予習のためにHaskellの本を買いました。

プログラミング環境は何をインストールするのがおすすめでしょうか?
OSはWindows 10を使っています。
369デフォルトの名無しさん
垢版 |
2020/08/13(木) 18:55:01.02ID:AeuuY+wz
Haskell Platformというのがいいみたいですね。
でもダウンロードしようとしたら、まず、Chocolateyとかいうのをインストールしなくちゃいけないんですね。
大丈夫ですか?これ?
2020/08/13(木) 21:17:46.02
Windows Subsystem for Linux 2 (WSL for short)を有効化してWSL用ディストリビューション(Ubuntu 20.04 LTSなど)をWindows ストアからインストールすることで、Windows内で仮想的にリナックスを使ってそこでHaskellを始めるのが良いです
371デフォルトの名無しさん
垢版 |
2020/08/13(木) 21:24:06.64ID:AeuuY+wz
Windowsと比較してリナックスの利点は何でしょうか?
大きなアドバンテージはありますか?
2020/08/14(金) 06:03:07.79ID:OycuixUd
>>369
今のHaskell Platformのインストールってそういう感じになってるんだな
Chocolatey自体はWindowsでそこそこよく使われているパッケージマネージャなので一応信頼してよい
373デフォルトの名無しさん
垢版 |
2020/08/14(金) 08:46:51.97ID:XgOd4/dA
>>370
Windowsにそのままインストールしちゃいました。



Windows PowerShellから起動する以外の使い方はないでしょうか?
GHCiというのもグラフィカルユーザーインターフェースのソフトはないのでしょうか?
374デフォルトの名無しさん
垢版 |
2020/08/14(金) 12:57:45.74ID:XgOd4/dA
リストとタプルについてなんですが、Pythonでのリストとタプルとは違いがあるようです:

let a = [1,2,3]
drop 1 a

としてもa == [2,3]とはなりません。

let b = (1,2,3)
drop 1 b

とするとエラーになります。

Pythonの場合は、a = [1,2,3]に要素を追加できましたが、b = (1,2,3)にはタプルがイミュータブルであるため追加できませんでした。
ですが、b[1:]とすれば、(2,3)というタプルが得られたと思います。

どう考えればいいのでしょうか?
2020/08/14(金) 17:17:33.31ID:58KQIAkg
>>374
副作用のあるコードの書き方を見せるのは簡単だけど、関数型が初めてなら
まずはHaskellのチュートリアルを読んで関数型の考え方を出来るようになったほうがいい
2020/08/14(金) 17:46:17.87ID:XgOd4/dA
>>375
ありがとうございます。
「すごいHaskellたのしく学ぼう!」という本の第1章を読み終わりました。この本を読んでいこうと思います。
2020/08/14(金) 20:54:14.09
なぜエラーになるかといえば、タプルにdropはないからです
リストは『全て同じ型』の要素の片方向リストです。要素数は可変です。C++のforward_listをイメージしてください

タプルは『それぞれ好きな型の組み合わせ』であり、リストではありません。要素数は固定です

両者は本質的に内部実装が異なります。リストは要素と、次に辿る先の情報を組にしたデータ構造、一方でタプルはその数だけデータを納めるのみのデータ構造です

抽象的には、リストは2要素のタプルであり、一項目に要素、二項目は(再帰的に)リストを保有します。
こうすることで、二項目を見れば(リストなので)『要素と、二項目にまたリスト』が格納されています
そのリストの二項目を見れば・・・となって単方向リストが実装できている事が理解できます

タプル(,)は二項関数であるとみなせます。コンマの左側と右側に一つずつ何かを取って入れる関数です。
リストでは実際は『:』という二項関数が二項タプルと同じ役目を果たします。つまり
要素 : リスト
のように書き
(要素, リスト)
と抽象的に同じであると気づくことができます。
2020/08/14(金) 23:21:17.25ID:OycuixUd
>>374
コンパイルエラーの文章を読んでぐぐる癖をつけよう
覚えはじめの頃に出会うエラーは大抵は文法ミスか型エラーだろうから
ぐぐれば「何が悪いか」はだいたい解決する
「なぜ悪いか」はすごいHaskellあたりを読み進めていけば習得できるはず
2020/08/15(土) 17:24:00.25ID:uxgG4TyL
>>377-378
ありがとうございました。
380デフォルトの名無しさん
垢版 |
2020/08/16(日) 18:14:55.92ID:tHIsB9jz
Haskellの本を読んでいると静的型付けだとか出てきます。
単にHaskellの仕様を理解するだけでなくもっと深く、どういう考え方でHaskellというプログラミング言語が設計されたのかにも興味があります。
プログラミング言語論みたいな本でおすすめの本はないでしょうか?
2020/08/16(日) 21:18:57.26ID:EuDMb00g
Haskellはある日突然に誕生したわけではなく、
その前身のMirandaとKRCという関数型言語から
多くの特質を受け継いでいます
これら言語に関してはW*k*p*d*aで簡潔に解説されてるので、
まずそちらを一読したのちに参考文献に当たるべきでしょう
以下ではW*k*p*d*aで欠けている日本語の文献を紹介します

Miranda
[1] 第7章 Miranda, p139-163,
 新しいプログラミング・パラダイム, 共立出版, 1989年
 ttps://www.am*z*n.c*.j*/dp/4320024931
 Mirandaに関する包括的な解説
[2] 関数プログラミング, 近代科学社, 1991年
 ttps://www.am*z*n.c*.j*/dp/4764901811
 Mirandaを用いた関数型プログラミングの入門書
 モナドを含む圏論の応用/発展が誕生する以前の時代に書かれた貴重な教科書

KRC
[3] 4. 関数型言語 KRC, p36-47,
 新世代プログラミング, 共立出版, 1986年
 ttps://www.am*z*n.c*.j*/dp/4320022599
[4] 6.2 KRC (Kent Recursive Caluculator), p132-142,
 プログラミング言語の新潮流, 共立出版, 1988年
 ttps://www.am*z*n.c*.j*/dp/4320023773
 [3], [4] ともKRCに関する包括的な解説
 KRCはすでにインデントベースの構文/純粋関数型/ パターンマッチ/リスト内包表記
 といった特質を備えた動的型付け関数型言語でした
2020/08/16(日) 21:54:00.05ID:jqjR96Dg
>>380
まず、Types and programming languages とSteve Awodey の Category Theory 読んでからや。

Haskell の話するのは。
2020/08/16(日) 22:04:09.80ID:mrCar2cd
Haskellは魔窟の巣窟や 近寄るものは内臓から食い散らかされるデー

初心者はPythonが最適やろ〜
2020/08/17(月) 17:36:03.87ID:CFLjXFs2
>>381-382
ありがとうございました。

Types and programming languagesというのが比較的新しい本なので、興味を持ちました。
2020/08/17(月) 18:54:59.27ID:CFLjXFs2
クイックソートを行う関数を作ったのですが、エラーが出ます。どこが間違っていますか?

quicksort :: (Ord a) => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = (quicksort [t | t <- xs, t <= x]) ++ [x] ++ (quicksort [t | t <- xs, x < t])
2020/08/17(月) 19:01:32.08ID:QJrG17W6
>>385
Haskell初心者に限った事柄ではないけれど、
こうした場で質問する者の心構えとして
出てしまったエラーメッセージをコピペする
といった、当たり前の行動は身につけるべきだと思うよ
2020/08/17(月) 19:03:19.26ID:CFLjXFs2
>>386
ありがとうございます。
エラーメッセージは以下です。

Prelude> :r
[1 of 1] Compiling Main ( baby.hs, interpreted )

baby.hs:153:1: error:
parse error (possibly incorrect indentation or mismatched brackets)
|
153 | quicksort :: (Ord a) => [a] -> [a]
| ^
Failed, no modules loaded.
2020/08/17(月) 19:05:47.77ID:CFLjXFs2
インデントも間違っていないと思いますし、カッコも問題ないと思うのですが。
2020/08/17(月) 20:38:28.08ID:0Q701Csj
>>388

>>385 をコピペしたら、俺の環境では動いたよ。
取り急ぎ。
2020/08/18(火) 02:46:50.61ID:rj5JRKyz
153行より前の部分がおかしいんでしょ
2020/08/18(火) 10:50:34.85ID:QANbTDtx
>>389-390
ありがとうございました。
>>390
ご指摘どおりでした。ありがとうございました。
392デフォルトの名無しさん
垢版 |
2020/08/19(水) 15:58:22.36ID:FHOhxH/M
(1)と(2)で同じ関数だそうです。

add :: Int -> Int -> Int

add :: Int -> (Int -> Int)
と等価だそうです。

だとするならば、

(1)のほうが理屈の分かる書き方のように感じます。
(2)はadd' :: Int -> Int -> Intであると宣言しておきながら、その中身の表現を見ると、2つのInt型の引数を受け取ってその和を返す関数にしか見えません。
それにもかかわらず、add' 1は1引数の関数で引数に1を足す関数を表しています。非常に違和感を覚えるのですが、(2)は一体どういうことなのでしょうか?
わかりにくいです。

(1)
add :: Int -> Int -> Int
add n = \x -> x + n
(2)
add' :: Int -> Int -> Int
add' n m = n + m
393デフォルトの名無しさん
垢版 |
2020/08/19(水) 15:59:38.45ID:FHOhxH/M
単なる表現方法と割り切ればいいのでしょうか?
394デフォルトの名無しさん
垢版 |
2020/08/19(水) 16:07:34.77ID:FHOhxH/M
nに対して、「mにn+mを対応させる関数」を対応させる関数の表記法として、
add' n m = n + m
を採用するというのが非常に不自然に思います。
2020/08/19(水) 16:24:31.96ID:amUamLwq
入門書のカリー化の箇所を読めばいいんじゃね
haskell内での関数は一変数関数として扱えて、
add' n m = (add' n) m
というだけ
396デフォルトの名無しさん
垢版 |
2020/08/19(水) 16:31:52.13ID:FHOhxH/M
>>395
ありがとうございます。
(1)の表記法だけ許してほしいと思うんです。(2)だけみたらまるで2変数関数のように見えますから。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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