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

■ このスレッドは過去ログ倉庫に格納されています
2019/01/29(火) 09:05:47.90ID:gJP/u7IJ
関数型プログラミング言語 Haskell について語るスレです。

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

前スレ
関数型プログラミング言語Haskell Part31
https://mevius.5ch.net/test/read.cgi/tech/1506447188/
2019/02/23(土) 18:05:45.67ID:RiBir1w3
>>188
foo10は結局のところ ¥x->x*n を呼び出してるだけじゃないの?
¥x->x*10って関数を生成してないよね?

そういうことではない?
2019/02/23(土) 18:08:48.44ID:7gjHPQsv
C++だったらtemplate引数として渡したら定義で、コンストラクタに渡したら生成
静的と動的がわかるのが前提だからわからないならpythonかjavascriptから始めるべき
2019/02/23(土) 18:12:36.80ID:RiBir1w3
>>190
PythonならBlenderで頂点やマテリアル抽出するときに必須だったから使ったことあるけど
インデント縛りで胃が溶けそうだった
正直もうやりたくない・・
192デフォルトの名無しさん
垢版 |
2019/02/23(土) 18:18:49.99ID:5fn4St+r
>>189
> foo10は結局のところ ¥x->x*n を呼び出してるだけじゃないの?

Prelude> foo10 10
100
とかのこと言ってるんなら
let foo10 = foo 10
で生成した関数(¥x -> x * 10)を呼び出してるつまり
(¥x -> x * 10) 10
100

> ¥x->x*10って関数を生成してないよね?

してるよ
let foo10 = foo 10 の foo 10の部分で。
(生成のタイミングは今回置いとくとして)
2019/02/23(土) 18:28:43.67ID:RiBir1w3
>>192
わかった!
無名関数で定義されてるからできるってことかー
納得できたありがとう

次行ってみる
2019/02/23(土) 18:29:48.03ID:7gjHPQsv
templateとコンストラクタとメソッドの考え方
関数と関数と関数の考え方
変わったのは見た目だけ
2019/02/23(土) 18:33:42.53ID:RiBir1w3
>>194
C++は全く知らないのでそっちはなんとも
2019/02/23(土) 18:51:02.51ID:RiBir1w3
早速詰まった何を言ってるのかわからん

一般に、関数を呼び出す場合、関数を評価するための環境は空リストです。
最初に、引数がこの環境に追加されます。let で定義される局所変数もこの環境に追加されます。
もしも、環境に該当する変数が存在しない場合は大域変数を参照します。

たとえば、foo 5 と呼び出すと環境は次のようになります。

foo 5 ==> 環境 : [(n, 5)]

ghciで実行

Prelude> let foo n = ¥x -> x * n
Prelude> foo 5

<interactive>:2:1: error:
• No instance for (Show (Integer -> Integer))
arising from a use of ‘print’
(maybe you haven't applied a function to enough arguments?)
• In a stmt of an interactive GHCi command: print it
Prelude>

そりゃそうだよねぇ・・
なんなんだろう何が言いたいのかさっぱりわからない
本当にこんな説明でみんな理解してったの?
2019/02/23(土) 19:26:38.79ID:hS0A7KKk
>>196
そこクロージャの説明のとこでしょ? 読み飛ばしていいと思うよ

手元にHaskellの入門書何冊かあるけど目次や索引にクロージャ無いし
純粋関数型言語でありデフォルトで関数がカリー化されているHaskellに
クロージャとかいう概念は別に要らないと思う
部分適用便利だねってことがわかればおk
2019/02/23(土) 19:34:16.40ID:RiBir1w3
>>197
そっかわかったありがとう!
関数の合成もすぐわかったのでさらに次行ってみる
2019/02/23(土) 20:14:35.45ID:RiBir1w3
データ型の定義まで来た
なんというかやっぱりこのサイトこれからhaskell入門の人にはどうでもいい余計なこと書きすぎなんじゃ・・
と思った
2019/02/23(土) 21:08:00.52ID:RiBir1w3
do構文がIO型だからこのように書ける・・というのがどうもしっくりこないけど
都合上こうするしかなかったってだけの話で特別な意味はないのかな

calc :: IO ()
calc = do
putStr "Input Integer1 > "
x <- readLn :: IO Integer
putStr "Input Integer2 > "
y <- readLn :: IO Integer
let a = x + y
b = x - y
c = x * y
d = x `div` y
n1 = show x
n2 = show y
putStrLn (n1 ++ "+" ++ n2 ++ "=" ++ show a)
putStrLn (n1 ++ "-" ++ n2 ++ "=" ++ show b)
putStrLn (n1 ++ "*" ++ n2 ++ "=" ++ show c)
putStrLn (n1 ++ "/" ++ n2 ++ "=" ++ show d)
2019/02/23(土) 21:24:41.95ID:24PtBhaW
>>200
いちいち躓いたところで立ち止まらない
これは別に関数型がどうとかに限った話じゃなく、未知のジャンルの勉強の話
まず思考を殺して30回読み返す
学ぶは真似ぶから始まる
2019/02/23(土) 21:25:53.99ID:RiBir1w3
納得しないと進まないタイプなので
2019/02/23(土) 21:31:22.65ID:24PtBhaW
>>202
じゃあモナドとflatMapを理解しきってからdo構文に進んでください
それ以外にないです
2019/02/23(土) 21:37:05.47ID:wr+1lm8V
読んでいるサイトが悪いのではないかなあ
すごいH本とか
HaskellではなくてOcamlだけど浅井『プログラミングの基礎』とかを読んだ方が
良いレベルだと思う
2019/02/24(日) 01:39:36.53ID:qI0VELUi
>>200
do は (>>=) の糖衣構文 (=分かりやすく見やすくするための別記法) なので最終的にはモナドと (>>=) を理解するまではしっくりこない。

https://qiita.com/saltheads/items/6025f69ba10267bbe3ee
2019/02/24(日) 01:52:29.83ID:BExwBIrb
最終的に>>=演算子オーバーロードを理解する頃には難易度がC++と同じ
2019/02/24(日) 11:45:28.69ID:mBeDvEXM
>>205
そういうことなら先に進んでもよさそう
リンク先の見たら変換可能なこともわかった
ありがとう!
2019/02/25(月) 13:11:14.94ID:EIUHHo5S
haskellのGUIは何が主流なの
gtkじゃネイティブUIに見えないからqtahとか?
もしくはhaskellではGUIを扱わないとか?
2019/02/25(月) 21:33:28.52ID:jyEH5AtM
趣味でやってるが Threepenny 使ってる
簡単に組み合わせられるようになるかなと
Elm も学習中
2019/02/26(火) 21:42:21.10ID:DUz4HSDe
書籍「Thinking with Types」の第1章をサンプルPDF版で読んでいるのですが、
19ページ目の Exercise 1.4-i でつまずいています。

数式 (a^b)^c と a^(b*c) が等しいことを Curry-Howard isomorphism を使って証明する問題ですが、
これは、

to :: (b -> c -> a) -> (b, c) -> a
from :: ((b, c) -> a) -> b -> c -> a

という型の Haskell の関数を見つけよ、と言うことですよね。
しかし、問題文に書かれている

to . from = id
from . to = id

の意味が分かりません。

to . from の型も from . to の型も共に id の型とは等しくないと思うのですが・・・
2019/02/26(火) 21:57:34.53ID:PosTOau2
to :: (b -> c -> a) -> ((b, c) -> a)
from :: ((b, c) -> a) -> (b -> c -> a)
2019/02/27(水) 01:02:26.71ID:2D6fGXPQ
Haskellにはファーストクラス多相関数がないから
idの型は単相なんだろう
単相のidという名前の同音異義語がちょっと多すぎるだけ
2019/02/27(水) 02:05:02.68ID:kdg0sG7A
>>209
思い出して今日発売のelm本、買おうかなと思ったら尼で売り切れててワロた。
2019/02/28(木) 17:06:29.75ID:W9NOQ7xg
下記の2つの関数の rank について
関数 f は rank 2、関数 g は rank 3 で合ってる?

f :: a -> (forall b. b -> c)
g :: a -> (forall b. b -> c) -> d
2019/03/03(日) 20:55:07.64ID:/obVPbHS
>>212
やっと意味が分かりました。
ありがとうございした。
2019/03/03(日) 22:40:24.54ID:iXSrdfon
条件を満たす限り畳み込むfoldWhileみたいな関数がないのはなぜ?
scanとtakeWhileで出来なくもないけど無駄なリストが生成されちゃうよね
2019/03/04(月) 10:06:50.76ID:P5wfz8lO
scanした後はlast.takeWhileとかだと思いますがfusionされるので作られません
2019/03/04(月) 11:18:43.16ID:yQsTNF7X
>>217
ありがとうございます
fusion調べてみます
2019/03/09(土) 09:51:28.74ID:KBqn1KqM
haskell入門ほぼ読んだけどちょっと物足りなくてもうすこしhaskell勉強したい欲がある(目的は競プロとか月並みにaiとか)
なんかええ本ある? 数学の高速なライブラリとか圏論、モナドの解説あるやつで(数学は拒絶反応しない)
get programming with haskellとか並行並列とか多少気になってるけどどう?
2019/03/09(土) 10:30:48.34ID:Vn/el/At
初心者を抜けた後、実践へ進みたいのなら幾つか勧められる本はある。

しかし、更なる勉強がしたいのなら、勧められる本はない。
初心者用か、初心者を抜けたばかりの者にはまだ難しい本しかない。
特に君の目的(競プロやAI)に叶う本は今のところ皆無だ。

なので、ネットを漁れ。

あと質問がやや曖昧で、何を求めているのか分からん。
数学の高速なライブラリの何を求めてる?
それを自作できる知識なのか?
活用する知識なのか?
もしくは、仕組みが知りたい具体的なライブラリでもあるのか?

圏論やモナドにしても然り。
それらの何が知りたいのか具体的に言ってみ。
2019/03/09(土) 11:02:47.64ID:KBqn1KqM
>>220
具体的には数学書のような理論本ですね 今のところ全然数学臭さがないので(コンピュータとは乖離してるかもしれないけど)
速度に関しては、命令型の書き方でないのでどうすれば速度が出る書き方が出来るかが一番興味あります
ai,競プロはやるとしたときの足掛かりが気になりました
このみっつのどれかが掘り下げられれば幸いです。
2019/03/09(土) 11:19:03.37ID:SKFKP+LU
THUNKとかWHNFとかだろうけど
俺もここら辺の本とかあるなら読んでみたい
2019/03/09(土) 11:28:44.92ID:Vn/el/At
>>221
「数学書のような理論本」 悪いが意味が分からん。
具体的に「何が知りたいのか」を言ってくれ。
理論と言うのが大雑派すぎる。

速度を上げる方法を学びたいのなら、
・Haskell High Performance Programming
・関数プログラミング 珠玉のアルゴリズムデザイン
この2つが正にうってつけだが、
「Haskell入門をほぼ読んだ」段階では挫折しそう。

AI や競プロは前レスでも言ったが本は無い。
AI は reinforcement leaning や deep leaning など技術範囲を絞ったワードと
haskell を組み合わせたキーワードでネット検索。

競プロは実際の競技で提出されたソースをたくさん読んで真似しろ。
2019/03/09(土) 11:50:40.66ID:KBqn1KqM
>>223
どうもありがとうございます。図書館で覗いてみます
具体的には、数学との関わりを体系だって書いてる書籍を探してましたが、そりゃ個々のキーワードで探す方が手っ取り早くて色々漁れますわな
2019/03/09(土) 13:09:34.75ID:HqfcKPNw
競プロにHaskellはどうなんだ…?
良くわからんけどSTモナド使いまくる感じになるのかな
あるいは珠玉のアルゴリズムを理解仕切った超人達の集まりなのか
2019/03/09(土) 13:43:47.24ID:w1EXpOnc
>>221,223
珠玉のアルゴリズムデザインへの入門としては同じ著者の
『Haskellによる関数プログラミングの思考法』
(旧版名は『関数プログラミング入門 ―Haskellで学ぶ原理と技法―』)
がいいと思う
他の入門書よりは数学色が強いし
等式変形によって効率を改善していく運算も割と丁寧に扱っていると思う

あとは『純粋関数型データ構造』とかも参考になるかも?
ただ競プロならSTRefとかSTUArrayとかに習熟するほうが
手っ取り早いし有力かも
2019/03/09(土) 13:49:45.09ID:Vn/el/At
>>225 >>226
例えば AtCoder の参加者のコードを見てみると分かるが、
STモナドなんて使ってるヤツはいない。
そもそも、haskell に慣れたら、STモナドなんて使いにくいだけだろ。
競プロみたいな短く速いコードを書く必要があるなら尚更。

珠玉本を理解しきった者かどうかは知らんが、
極端に短いコードで解いてくるヤツは、
どちらかといえば数学の知識が豊富なんじゃないかな。
問題文を数学の世界に落とし込む事に長けているように見える。

コンテストにもよるが、競技プログラミングは
個人的にはアルゴリズム力よりも数学力がより大事だと思ってる。
例えば Project Euler の高番号問題をシンプルに解けるヤツは競技も強そう。
2019/03/09(土) 15:47:05.82ID:KBqn1KqM
>>226 >>227
どうもありがとうございます。StateとかSTは内部処理はよくわからないけど便利なので使い方おぼえておきたいとこですね
2019/03/09(土) 20:50:02.63ID:2ErVpr0y
珠玉本難解すぎる
登場する学生達が天才過ぎる
2019/03/10(日) 04:06:11.50ID:0rKUQSsg
>>229
それでも理解したいのなら質問すればいい
2019/03/14(木) 01:49:52.87ID:pUnQtnNt
instance head ってよく聞くけど、
これは instance 宣言のどの部分のこと?

例えば次の宣言の場合
instance (Foo a) => Bar (Baz a b) | a -> b where

・(Foo a)
・Bar (Baz a b)
・Bar (Baz a b) | a -> b
・instance キーワードと where キーワードの間の全部
・その他

どれ?
2019/03/14(木) 02:00:29.34ID:pUnQtnNt
>>231
すまん、instance 宣言に関数従属は無いよな。

改めて、

instance (Foo a) => Bar (Baz a) where

この例だとどこが instance head なんだ?
2019/03/14(木) 08:32:21.91ID:pUnQtnNt
>>231
自己解決した。

instance head は => より右側かつ where より左側の部分だった。

スレ汚してすまない。
234デフォルトの名無しさん
垢版 |
2019/03/20(水) 22:23:43.02ID:GM5azBbl
HaskellのGUI(Gtk2hs)でカウンター作ってみた。

import Graphics.UI.Gtk

main = do
initGUI
window <- windowNew
set window [windowTitle := "counter", containerBorderWidth := 10]
mainbox <- vBoxNew True 5
containerAdd window mainbox
label <- labelNewWithMnemonic "0"
boxPackStart mainbox label PackNatural 0
countbtn <- buttonNewWithLabel "Count"
clrbtn <- buttonNewWithLabel "Clear"
boxPackStart mainbox countbtn PackNatural 0
boxPackEnd mainbox clrbtn PackNatural 0

widgetShowAll window
onClicked countbtn (labelGetLabel label >>= \n -> labelSetText label (show (1 + (read n))))
onClicked clrbtn (labelSetText label "0")
onDestroy window mainQuit
mainGUI
235デフォルトの名無しさん
垢版 |
2019/03/20(水) 22:24:12.70ID:GM5azBbl
label <- labelNewWithMnemonic "0"
boxPackStart mainbox label PackNatural 0
countbtn <- buttonNewWithLabel "Count"
clrbtn <- buttonNewWithLabel "Clear"
boxPackStart mainbox countbtn PackNatural 0
boxPackEnd mainbox clrbtn PackNatural 0

widgetShowAll window
onClicked countbtn (labelGetLabel label >>= \n -> labelSetText label (show (1 + (read n))))
onClicked clrbtn (labelSetText label "0")
onDestroy window mainQuit
mainGUI
236デフォルトの名無しさん
垢版 |
2019/03/20(水) 22:24:33.45ID:GM5azBbl
boxPackStart mainbox countbtn PackNatural 0
boxPackEnd mainbox clrbtn PackNatural 0

widgetShowAll window
onClicked countbtn (labelGetLabel label >>= \n -> labelSetText label (show (1 + (read n))))
onClicked clrbtn (labelSetText label "0")
onDestroy window mainQuit
mainGUI
237デフォルトの名無しさん
垢版 |
2019/03/21(木) 05:11:02.25ID:EnD5r7yP
コマンドラインでエンターを押すごとに数字が増えていく(Ctrl+C押すまで止まらない)
Haskellコード

main = mapM_ (\n -> print n >> getLine) [0..]


out:
0
1
2
3
4
2019/03/21(木) 22:17:24.35ID:2nCrXVEC
急にどしたんww

gtk2hsのドキュメントがHackageから消えてるのは気のせい?
2019/03/21(木) 22:23:19.66ID:NO+0ze73
なかなかGHC8.8出ないね
2019/03/21(木) 23:42:33.25ID:42YMN3yF
無限ポップアップ上げるやつ現れないとは高尚なスレ
リストで遅延評価使うのがなかなかハスケルっぽい
241デフォルトの名無しさん
垢版 |
2019/03/22(金) 06:11:43.80ID:t/nkQ3ne
一応、カウンターみたいなのは純粋関数型言語には作れない言われてたから、作ってみた。
確かにi++みたいな事は出来ないが、違う方法で参照透明性を確保しつつ実現出来ると実感。
(個人的にHaskellには副作用はあると考えているが、参照透明性は崩れないとも考えている)
2019/03/22(金) 07:23:09.19ID:hntcvuv1
そりゃ副作用はあるよ。
じゃなきゃIO処理できない。

haskell の特徴は純粋な関数から副作用のある関数を呼べないこと。
243デフォルトの名無しさん
垢版 |
2019/03/22(金) 07:32:41.43ID:t/nkQ3ne
うい。
そう言う仕組みになってるくせに、IOな関数も扱いとしては純粋な関数と同じ扱いなのが気に入ってます。
(型に気をつけていれば自然とそうなるし、普通にprint関数と純粋関数を関数合成出来るのが好き)
2019/03/22(金) 07:54:45.66ID:chPt0Ign
純粋関数型言語でカウンタが作れないというのは、
同じ関数を呼び出した結果がカウントアップされるような関数のこと。
pythonで書くとこんな感じ。
>>> def create_counter():
  n = 0
  def counter():
    nonlocal n
    n += 1
    return n
  return counter

>>> counter = create_counter()
>>> counter()
1
>>> counter()
2
245デフォルトの名無しさん
垢版 |
2019/03/22(金) 08:09:16.10ID:t/nkQ3ne
>>244
そうなんですが、純粋関数型言語の場合、その関数を何回呼び出したのかカウントする関数を作るみたいな視点の切り替えで対処するのではと。
つまり自身のファイルを読み込んで自身(counter関数)を

a = counter
b = counter

a = 1
b = 2

に置き換える関数なら作れます。

欲しいのは結果であり、動作ではなく結果が同じなら良いと言う解釈です。
246デフォルトの名無しさん
垢版 |
2019/03/22(金) 10:06:06.24ID:t/nkQ3ne
終了やカウントクリアに対応してみた。

import System.Exit

main = do putStrLn "quit code is 'q', count clear code 'c'"
mapM_ (\n -> print n >> getLine >>= f) [0..]

f "quit" = exitWith ExitSuccess
f "clear" = main
f _ = return ()
2019/03/22(金) 11:13:34.22ID:RqYJx/o4
副作用もカウンタもGUIもHaskellでできる (Haskellで作れるとは言っていない)
248デフォルトの名無しさん
垢版 |
2019/03/22(金) 14:11:11.50ID:t/nkQ3ne
まあ要はcounter関数はswap関数と同じですよ。
手続き型言語ではソートや繰り返しに必須ですが、関数型言語で各種ソート作る時にswap関数は使った事がない。
木を見て森を見ずというか、counter関数を何に使うの?って話で、カウンターとしての用途なら再帰関数の引数でf (x + 1)とか渡せば良いだけですし。

loop10 n | n > 10 = return ()
loop10 n = print n >> getLine >> loop10 (n + 1)
2019/03/22(金) 14:35:43.76ID:tc5CuCjg
つまりHaskell(というかElm?)で無限アラート書いとけば捕まらなかった?
2019/03/22(金) 15:17:19.58ID:JJ/MZDcL
Haskellの再帰は場合によってはヒープを使うから
10^9回ぐらい閉じる奴がいたらサイバーテロとして扱われてたかもしれない
251デフォルトの名無しさん
垢版 |
2019/03/22(金) 15:36:25.55ID:t/nkQ3ne
そこは気を付けなきゃだけど(と言うか、スタックは兎も角ヒープ使うってreverseみたいにリスト溜め込むとかだけで、手続き型言語でもあり得る場面に限られそうだが)、
むしろモナドな再帰(IOはもちろん、リスト->リストな再帰も)がループになると言うのは、
手続き型言語よりも再帰でスタック使うケースが少ないと言う魅力もある。
(ここは手続き型言語が末尾再帰最適化に対応しても追いつけない所)

>>246 の通り、mainを再帰的に呼び出してもループになると言うのは知る限り手続き型言語では見たことない。

main変数が他の言語で言うmain関数的な動きをしているのも、圏論的には変数は引数無しの関数と見做せるから。
main変数を評価しようとすると束縛されたプログラムが動き出す。

n = 1 ― 変数であり、常に1を返す引数無しの関数
2019/03/22(金) 17:16:42.19ID:JJ/MZDcL
いやGHCが与えるスタックはヒープなんだよ
Cのコールスタックみたいな固定領域じゃなくてね
それもデフォルトで最大メモリの8割というデカさだから
うっかり非末尾再帰を放っておこうものならスワップ地獄に陥る
2019/03/22(金) 18:49:40.42ID:tc5CuCjg
非末尾再帰を末尾再帰に自動変換するのって技術的に不可能?
末尾再帰ってなんか無理やり感あるよね
254デフォルトの名無しさん
垢版 |
2019/03/22(金) 19:00:24.32ID:E/4CSIEY
フィボナッチを再帰で書くと定義がそのまま動く感動が味わえるのに末尾再帰に書き直すととたんに台無しになるよねw
255デフォルトの名無しさん
垢版 |
2019/03/22(金) 22:26:05.94ID:t/nkQ3ne
ヒープにあろうがスタックにあろうが末尾再帰に意識して書けばまず解決する問題だね。
ghciやrunghcみたいなスクリプト形式だと最適化(部分的な正格評価)が不十分で

sum’ n [] = n
sum’ n (x:xs) = sum’ (n + x) xs

という末尾再帰があった場合、

sum’ 0 [1,2,3]
= sum’ (0 + 1) [2,3]
= sum’ ((0 + 1)+ 2) [3]
= sum’ (((0 + 1)+ 2)+ 3) []

みたいに(遅延評価のせいで)結果を入れる変数の方でスタック消費するけども、コンパイラ(ghc)の方はこの問題は無い。
256デフォルトの名無しさん
垢版 |
2019/03/22(金) 22:43:20.21ID:t/nkQ3ne
>>254
別に数列(リスト)から取り出す形にすれば末尾再帰にする必要ないでしょ。

main = print $ fibs!!3 ― 0から数えて3番目
where fibs = 0:1:zipWith (+) fibs (tail fibs)

foldlの正格評価版 foldl’みたいにzipWithの正格評価版作って差し替えると高速化する。
(このネタ書いてたブログの人はzipWith’を標準で入れてて欲しいって書いてた)

zipWith’ f (x:xs) (y:ys) = seq a $ a:zipWith f xs ys
where a = f x y
zipWith’ _ _ _ = []
2019/03/22(金) 23:37:15.19ID:cqN2FVLj
>>256
定義そのままで書きたいって話であって末尾再帰だからダメとは言ってないでござるよ
2019/03/23(土) 11:46:10.06ID:CUvnstPX
「感動」はダメとは言わないが意味がわからないと言いたい
2019/03/23(土) 11:57:03.27ID:XiFmcVOc
自然に書くなら数学の定義通り書くよね
でも今のコンピュータの制約上仕方なく末尾再帰にしないといけないよね
自然に書ける日は来ないのかなあってある種当たり前の感覚だと思うけど
2019/03/23(土) 11:59:26.53ID:OxD1K8Qf
コンピューターの制約で変えねばならないならば定義に問題がある
定義は可能な限り一般に適用可能でなければならない
よって定義を変えればよい
2019/03/23(土) 12:03:29.66ID:CUvnstPX
感情をそのまま言語化できるなら犬や猫も言葉を話せることになる
実際には感情と言語は一致しないので感情をそのまま言語化することはない
2019/03/23(土) 12:16:16.80ID:XiFmcVOc
何か噛み合ってないな
自然な感覚に近い表現ができるほうが可読性高いよねくらいの話でしかないはずなのに
今何の話になってるんだ??
2019/03/23(土) 12:18:39.39ID:CUvnstPX
言葉を話さない動物やAIには言語の制約がない
ゆえに動物やAIは人間を超える可能性がある
壮大な詭弁だ
2019/03/23(土) 12:22:19.42ID:OxD1K8Qf
末尾再帰=ループ

分岐が発生するとこの関係が崩れる
2019/03/23(土) 12:26:33.46ID:XiFmcVOc
何か変なとこに手出しちゃったみたいですね
もうやめときます
スレ汚し失礼しました
2019/03/23(土) 13:28:21.51ID:CUvnstPX
可読性で思い出したが
ソースを読まなくても使ってみればわかることは読まない方がいい
読んだときの自然な感覚なんかよりも、そもそも読まないのが最も自然
2019/03/23(土) 16:34:59.79ID:3o0No0Hu
可読性をあげるためだけに型に別名つけるのってどうなの

type Description = Text

みたいなやつ
2019/03/23(土) 17:38:52.05ID:LmX3enfk
まあ読みやすさっていうか書きやすさだよなそれ
2019/03/23(土) 18:36:54.54ID:CUvnstPX
読むコストを下げるためだけにギャンブル
○○のコストは安いというのが本当か嘘かを賭ける

賭けないのが最も安いと思わないか
270デフォルトの名無しさん
垢版 |
2019/03/23(土) 19:48:40.97ID:abrpiqJH
>>259

https://i.imgur.com/816HQOu.jpg

https://i.imgur.com/wTI8fNg.jpg

一応、末尾再帰も式変形した定義通りなんだけどね。

fib3 0 a _ = a
fib3 n a b = fib3 (n - 1) b (b + a)

n = フィボナッチ数のn番目(fib n)

a = fib nの時のフィボナッチ数

b = fib (n + 1) の時のフィボナッチ数

fib3 nはfib3 (n - 1)のbがaになり、b(fib3 (n + 1))はfib3 (n - 1)のb(fib3 n) と a(fib3 (n - 1))を足したものである。
2019/03/23(土) 23:02:28.70ID:3o0No0Hu
>>269 賭けない、は具体的には何? 型シノニムを使わないということ?
2019/03/24(日) 00:23:58.92ID:d5Z4QiMu
>>271
使うのは自由だが可読性の勉強等はしないということ
2019/03/24(日) 00:47:12.07ID:xnhJaehN
>>272
悩んでないでスタイルを決め打ちして自分が自然だと思える書き方で行く、みたいな感じですか
2019/03/24(日) 09:54:41.46ID:d5Z4QiMu
そんな言葉は使う必要がねーんだ
書き方は決まってないのにもうすでに書き終わってるからだ
2019/03/24(日) 11:22:25.74ID:aOFJUm+g
やっぱりHaskellは常人向けではないんですね
Ocamlやります
2019/03/24(日) 12:49:13.41ID:d5Z4QiMu
そういえば言語も決まってなかったな
常人は言語を決めないとプログラムを書けないってマジ?
2019/03/24(日) 15:26:29.39ID:x/w14fyx
>>275
Windowsでは、昔のrubyみたいな状況なので、
それ以外のプラットフォームでやるのがいいよー
278273
垢版 |
2019/03/24(日) 16:35:05.61ID:xnhJaehN
よく判らないアドバイスだったな…
勉強・研究しないで突っ込むのはそっちの方が賭けてる感あるし、
すぐに書き終えるなら確かにそういう難しさはないが、
ソフトウェアのプロジェクトって面白いものは大抵長くなると思う。

>>277
Windows環境はWSLではダメなん?
2019/03/25(月) 18:54:20.99ID:3963segm
>>261
感情表現と言うように感情はあくまでイメージ想起性のもので
文法を持ってないものだと思う。
感情をそのまま言語化なんて人間でもしてないだろ。
あくまで論理的内容の会話文章の表現に感情を想起させる表現を
選んで論理としては同じだけれど得られるイメージが異なる文を
作っているだけだと思う。
そこで文を構成するために選ぶ表現がやたら極端なときに、感情的と評されているだけで。

ていうかおじさんになったしもう無理
2019/03/25(月) 20:49:31.29ID:PHYb4OS3
>>279
得られるイメージが変わってしまうのはコンピュータの制約のせいだよ
fibのイメージをそのまま表現できたら感動するのになあ

この状況ではコンピュータの制約は変えたいがイメージは変えたくない
「論理としては同じだけれど得られるイメージが異なる」という想定は大外れ
2019/03/25(月) 21:05:17.06ID:8+7iDICf
イメージw
お前らあほだろ
2019/03/25(月) 21:17:58.51ID:PHYb4OS3
コンピュータの制約が悪夢のようだから消去法でイメージ
あほなことしてるだろ
俺達なんだぜこれ
2019/03/25(月) 21:19:23.78ID:3963segm
イメージないと妥当性の判断もできんぞ。
これだって
書き込み内容を読んで
内容から推測される人物像をいままでの記憶から割り出して
そういう人物に対してかつてもった心象(イメージ)を
この場合の想定(先入観)として設定して
否定的判断をするという内容を伝達しているだろ

大体こういうプロセスじゃね?
284デフォルトの名無しさん
垢版 |
2019/03/25(月) 21:58:18.36ID:25q5twYk
数学の世界で効率を全く重視してないわけじゃないからな。無限の速度のCPU上なら同じと見なせるってだけで。

末尾再帰のfibとか数学的だからアーキテクチャ関係なく元の定義より速い。
行列苦手だから書けないが、もっと速い行列バージョンも存在する。
2019/03/25(月) 22:00:17.95ID:q0PAKLo0
これなんか深かった。結局愚直なコードのままで良かったみたいな
https://haskell-jp.slack.com/archives/C5666B6BB/p1551956556140300
2019/03/25(月) 22:05:21.04ID:q0PAKLo0
あとこれ。今はコンパイラが賢くなったのでfoldlが遅くなくなったよって話
https://qiita.com/autotaker1984/items/09c5ceaa13e9077f5359
287デフォルトの名無しさん
垢版 |
2019/03/25(月) 22:10:40.54ID:25q5twYk
これはPrologについて書かれているが、ここで話題にしてるのはこの記事と同じ議論だろう?

宣言型プログラミングの可能性と限界
https://thinkit.co.jp/article/157/3
2019/03/25(月) 22:23:26.20ID:PHYb4OS3
全く読んでないがパラダイムと論理は同じではない
パラダイムの限界と論理の限界は同じではない
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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