トップページtech
1001コメント316KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/01/21(月) 02:16:16.07
haskell.org
ttp://www.haskell.org/

日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
Part17 ttp://toro.2ch.net/test/read.cgi/tech/1325510368/
Part18 ttp://toro.2ch.net/test/read.cgi/tech/1331902463/
Part19 ttp://toro.2ch.net/test/read.cgi/tech/1340760070/
Part20 ttp://toro.2ch.net/test/read.cgi/tech/1350428908/
0655デフォルトの名無しさん2013/03/06(水) 11:15:27.50
他の関数型言語はHaskellほど縛りがきつくないのもあるんだろ?
逆に言うとHaskellは副作用(参照透明性の確保?)に対して厳格すぎるから
モナドとかいう難しいものを導入しなければならなかった、と理解してるんだけどあってるかな?
そこまで厳格に参照透明性にこだわるメリットってなに?
0656デフォルトの名無しさん2013/03/06(水) 11:16:55.86
そういう宗教
0657デフォルトの名無しさん2013/03/06(水) 11:29:19.44
中途半端になると弱い
現に、オセロでは中央より隅の方が強い
0658デフォルトの名無しさん2013/03/06(水) 11:31:35.23
C++等でテスタビリティとモジュラリティの為にconst付けまくるみたいなスタイルは
手続き型言語における参照透過性のメリットの一例
意味論で考えると参照透過な実装はそうでないものより事前事後条件が簡単っていうのがある
つまり意味論的な解析を利用するような静的検査がやりやすい
こういうのがデフォルトで使えるっていうのは「タイプは基本的に遅いけどconstは一瞬で打てるようになった」みたいな人にとっては青い芝生だわな
0659デフォルトの名無しさん2013/03/06(水) 11:43:40.81
つまりバグの出にくいプログラミングスタイルを言語で強制するって事?
0660デフォルトの名無しさん2013/03/06(水) 11:54:23.35
少し自分の頭を使えよ
参照透過性のメリット理解できてないとか
プログラマとして普通に三流だぞ
0661デフォルトの名無しさん2013/03/06(水) 11:55:06.10
テストしやすい、ということもある。
入力以外の、たとえばグローバル変数みたいなものに影響されないから。
0662デフォルトの名無しさん2013/03/06(水) 11:55:42.00
>>660 の人は何がしたいんだろうか
0663デフォルトの名無しさん2013/03/06(水) 11:56:44.40
どんな状況でも常に同じ結果を返す関数なら、
結果をキャッシュしたりすることもできるんだよね。
0664デフォルトの名無しさん2013/03/06(水) 11:57:48.69
関数の実行順序を考慮する必要が無くなるってことは並列処理にも向いてる
0665デフォルトの名無しさん2013/03/06(水) 11:59:41.13
マルチスレッド処理でロックの必要が無くなる
0666デフォルトの名無しさん2013/03/06(水) 12:06:56.12
>>660
プログラマを買いかぶってはいけない。プログラマの99%は三流以下だよ。
0667デフォルトの名無しさん2013/03/06(水) 12:27:28.45
タイムリーなネタかな?

http://shuklan.com/haskell/lec08.html#/
0668デフォルトの名無しさん2013/03/06(水) 12:38:24.67
IOネタはもうずっと年中タイムリー
0669デフォルトの名無しさん2013/03/06(水) 12:50:01.18
>>654
beep()で考えると、一回beep()が実行されると、一度音が鳴る。
続けて3回実行されれば、三度鳴る。というように積み重ねられる
ことによって、コンピュータの挙動が変化する。beep()自体は
変化がなくても、コンピュータ全体としては変化してしまう。
これが一般的な副作用。参照透過性の議論は計算モデル内部に
限定しての話でこれは勿論副作用論議の重要な部分だがすべて
ではない。
0670デフォルトの名無しさん2013/03/06(水) 12:53:19.80
haskellを使う理由を教えてください
当方PHPしかできません
0671デフォルトの名無しさん2013/03/06(水) 12:54:00.85
beep() がグローバル変数を書き換えてしまう事が無いことを保証できないしね
0672デフォルトの名無しさん2013/03/06(水) 13:10:31.81
>>670
生産性を高める為。
0673デフォルトの名無しさん2013/03/06(水) 14:34:31.13
659への返答は「そうだよ」じゃ駄目なんかな

まあでも,なんでわざわざ関数型言語を使うのか,というのは別の話のしかたもあるかも
lyahとか「なぜ関数プログラミングは重要か」あたりの文章を読んでみるとか
0674デフォルトの名無しさん2013/03/06(水) 14:48:43.95
いやっはー
0675デフォルトの名無しさん2013/03/06(水) 16:20:27.75
オレも質問。
・モナドにはIO、State、List、Exception、Maybe等々いまでも多数あるが、
これで終わりじゃないよね?まだこれからいろんなモナドが現れるんだよね?
アドホックに。
・それらは皆モナド則を満たすわけだが、このモナド則って結局何を言ってる
んだっけ?
0676デフォルトの名無しさん2013/03/06(水) 16:24:43.85
>>675
モナド則はモナドのモジュールを作る側が気をつけることで、
おまえみたいに誰かがモナドを作ってくれると思ってる奴は気にする必要が無い
0677デフォルトの名無しさん2013/03/06(水) 18:20:44.32
参照透過性
参照透明性

訳語として、どっちが普及してるの?

僕は参照透明性です!
0678デフォルトの名無しさん2013/03/06(水) 18:38:20.92
>>676
この人正常範囲の人?
0679デフォルトの名無しさん2013/03/06(水) 20:09:26.11
もうだめかもねこのスレ
はぁ
0680デフォルトの名無しさん2013/03/06(水) 20:15:24.32
おっさんが居なくなれば普通に平常運転だと思うけど
0681デフォルトの名無しさん2013/03/06(水) 20:19:24.63
>>630とか都合悪くなったら話逸らしてるし
無知を装った荒らしか無知な荒らしだと思います><
0682デフォルトの名無しさん2013/03/06(水) 20:35:02.50
おっさんが居なくなって別の奴が別の話を始める事象と
同一人物が話を逸らす事象は見分けがつかない
0683デフォルトの名無しさん2013/03/06(水) 20:55:04.16
Haskellでメモ化をしたいのだけれど
どうやるのがいいと思う?
0684デフォルトの名無しさん2013/03/06(水) 20:58:31.43
>>683
HaskellでPrologインタプリタを書く。
0685デフォルトの名無しさん2013/03/06(水) 21:03:09.41
>>679 など
このスレはなんかデリケートなオタクが多いようだな
0686デフォルトの名無しさん2013/03/06(水) 21:06:22.10
また来たのかおっさん
0687デフォルトの名無しさん2013/03/06(水) 21:07:03.58
ナイーブだな
0688デフォルトの名無しさん2013/03/06(水) 21:08:42.80
>>684
(´・ω・`)
0689デフォルトの名無しさん2013/03/07(木) 04:10:12.84
>>583
精神的な不義理ってなんだよ
0690デフォルトの名無しさん2013/03/07(木) 07:25:13.65
いまだに「敷居が高い」に突っ込み入れる阿呆居るんだな
0691デフォルトの名無しさん2013/03/07(木) 09:15:52.79
Haskellスレらしくていいじゃないか
0692デフォルトの名無しさん2013/03/07(木) 09:40:40.92
関数型言語は那珂太郎の詩のようなところがあるから。
..の..の..の..の..の..の..の..の..
0693デフォルトの名無しさん2013/03/07(木) 13:14:36.66
>>679
前スレよりはマシだよ……
0694デフォルトの名無しさん2013/03/07(木) 13:15:56.88
Haskellを汎用CPUで動かすの効率どうなの?
そういう最適化の準備あるなら専用プロセッサあった方がいいんじゃないの?
0695デフォルトの名無しさん2013/03/07(木) 13:20:28.26
GHCについて言うなら、基本設計からstock hardwareで最適に設計されてるので、
あまりそういう改善の余地は少ない。
0696デフォルトの名無しさん2013/03/07(木) 13:26:46.67
(´・ω`・)そうなんだー
0697デフォルトの名無しさん2013/03/07(木) 17:45:45.03
679が泣いたりするからつまらんくなったな
なんか言えよおまえら
0698デフォルトの名無しさん2013/03/07(木) 17:50:31.81
ソフトウェアトランザクショナルメモリの欠点について教えて
0699デフォルトの名無しさん2013/03/07(木) 18:46:50.69
口に出すと読みにくい
0700デフォルトの名無しさん2013/03/07(木) 21:33:41.08
遅い
0701デフォルトの名無しさん2013/03/08(金) 00:24:53.46
(´・ω`・)そうなんだー
0702デフォルトの名無しさん2013/03/08(金) 01:49:14.17
なんだその顔は!ふざけてんのか!
0703デフォルトの名無しさん2013/03/08(金) 02:11:11.39
  \|/
  /⌒ヽ   
  | ゜Θ゜) そうなんだー
  |  つ 
  | 噤@|
  \_/
0704デフォルトの名無しさん2013/03/08(金) 09:51:59.79
組み込みHaskell

http://leventerkok.github.com/hArduino/
0705デフォルトの名無しさん2013/03/08(金) 11:48:49.71
http://this-plt-life.tumblr.com/post/44462204757/simon-peyton-jones-adding-the-io-monad-to-haskell
0706デフォルトの名無しさん2013/03/08(金) 18:53:56.06
おっさんがいないと、何をしても心から楽しめないの、、、
0707デフォルトの名無しさん2013/03/08(金) 20:36:19.00
これってもしかして……恋?
0708デフォルトの名無しさん2013/03/09(土) 05:49:08.73
  ξ          ゞシヾ"  ヽ         ,,,....,,,、、...,,,....,,
  !           彡       ヽ:::     ..i'´.        ヾ'''、、、,,,
   シ          彡       ,j:::   ..,/ヾ,            ヽ
   !シ         ,,彡       :シ  ,;''''   ヾ   ,___       ヽ
    j  ,-‐-、   i    ッ三ミ:;j i、'  j-‐    `, , ‐'' = )       ヽ:
     し { !⌒- ヽ! j     ‐-‐'j ヽ、...'       '  .,_//,        !;::
     ヾ丶`-'  ! !        {__,__,!'         -‐' ヾ       ノ:::
      ,ヾ  '  、       ,'  ....,)        ::     ヽ     ノ::::::
 _...-‐‐'''´ :::            ´::(      _... ´       ヽ    /:::::::
        ::              ! .... -‐´           ヽ   /:::::     __,....,,-‐-、
 ::::.       ヽ   !......:-‐ー、 ,,,,,,;;;ヽ __ ...-‐、     ::     `ヽ-、___,--/'´ ,、   , `ヽ、
            !:::,´´´´´:::::`"""´:::::::::::::::;;;;;;;;ヽ、    ;::           ヽ-‐' !  ./   iヽ
07097082013/03/09(土) 05:49:42.46
誤爆しました・・・申し訳ありません
0710デフォルトの名無しさん2013/03/09(土) 07:50:42.74
"nを法とする剰余類環"の型って作れないのかなあ…
"Mod 12" 自体が型になってるようなの( C++風に書くと"Mod<12>" )
でも12の部分は型名じゃなくちゃいけないんだから無理か
0711デフォルトの名無しさん2013/03/09(土) 08:08:22.08
TH を使えばいけるかも あるいは
data Zero
data Succ a

的なのでゴニョゴニョ
0712デフォルトの名無しさん2013/03/09(土) 09:03:13.45
>>710
GHC7.6ならDataKinds拡張で12を型として使える
でも型レベルの加減乗除はまだ実装されてないのでまともに使えるかは知らん

{-# LANGUAGE DataKinds, KindSignatures, ScopedTypeVariables #-}
import GHC.TypeLits

newtype Residue (n :: Nat) = Residue Int {- invariant: 0<=x<n -}
 deriving (Eq, Ord)

-- smart constructor
residue :: forall n. (SingI n) =&gt; Int -&gt; Residue n
residue a = Residue $ mod a $ fromIntegral n
 where
  n = fromSing (sing :: Sing n)

instance Show (Residue n) where
 showsPrec p (Residue x) = showsPrec p x

instance SingI n =&gt; Num (Residue n) where
 Residue x + Residue y = residue $ x + y
 Residue x - Residue y = residue $ x - y
 Residue x * Residue y = residue $ x * y
 signum (Residue 0) = 0
 signum _ = 1
 abs x = x
 fromInteger = residue . fromInteger

main = do
 print (3 + 4 :: Residue 2)
 print (3 + 4 :: Residue 3)
 print (3 + 4 :: Residue 4)
0713デフォルトの名無しさん2013/03/09(土) 09:17:24.88
ほいな
http://ideone.com/O243Zk
0714デフォルトの名無しさん2013/03/09(土) 11:21:45.67
質問です
ファイルをインポートしようとしたのですがエラーがこのようにでました。
Could not find module `Dates'
Use -v to see a list of the files searched for.
Failed, modules loaded: none.
Dates.hsでは
module(
--- data や 関数
) where
のように外部からアクセス出きるようにして、
インポート側はimport Datesを最初の行にいれています。何がいけないのでしょうか?
0715デフォルトの名無しさん2013/03/09(土) 12:03:57.56
>>714
Dates.hsを置いてるディレクトリと、GHCを実行してるディレクトリは同じになってる?
もし違うなら、-iとかを渡さないといけない
0716デフォルトの名無しさん2013/03/09(土) 14:22:34.44
同じディレクトリに移動してやったら出来ました。
ありがとうございます。
0717デフォルトの名無しさん2013/03/10(日) 03:59:11.20
みんなHaskellのことならなんでも知ってるな
0718デフォルトの名無しさん2013/03/10(日) 09:04:58.99
自分で言語を作るならどういう選択肢があるかを知ってる
Haskellの作者がどれを選んだかは知らないので後で調べる

他人が何をしたか調べる時間よりも、自分ならどうするかを考える時間の方が長い
0719デフォルトの名無しさん2013/03/10(日) 10:42:33.73
サーベイをさぼって「もうOlegがやってた」とかで数日無駄にするとかよくあった
0720デフォルトの名無しさん2013/03/10(日) 11:09:26.16
その代わり速読(笑)で数日短縮できるんじゃね
Olegが何を言いたいのか読む前から知ってるんだから
0721デフォルトの名無しさん2013/03/10(日) 17:15:35.63
以下をGHCiにロードすると' Parse error in pattern: n + 1'というエラーがでます
HUGでは通るそうなのですが何が悪いのでしょうか

drop2 :: Int -> [a] -> [a]
drop2 0 xs = xs
drop2 (n + 1) [] = []
drop2 (n + 1) (_:xs) = drop2 n xs
0722デフォルトの名無しさん2013/03/10(日) 17:34:47.51
>>721
(n+k)パターンはデフォルトでは使えなくなったような気がする。

あきらメロン
0723デフォルトの名無しさん2013/03/10(日) 17:36:49.41
NPlusKPatterns を指定
0724デフォルトの名無しさん2013/03/10(日) 17:40:50.58
{-# LANGUAGE NPlusKPatterns #-}

drop2 :: Int -> [a]->[a]
drop2 0 xs = xs
drop2 n [] = []
drop2 n (_:xs) = drop2 (n-1) xs
07257212013/03/10(日) 18:29:24.02
そうだったんですか
オプションが必要になるならあきらめマスクメロン
0726デフォルトの名無しさん2013/03/11(月) 15:13:22.76
関数内で関数定義するとテストできないよね?
みんなどうしてるの?
0727デフォルトの名無しさん2013/03/11(月) 17:03:19.41
テストが要るような関数をローカル定義にしないという解決法
0728デフォルトの名無しさん2013/03/11(月) 17:37:17.22
Javaだとリフレクション使ってprivateメソッドもテスト可能だが
Haskellの関数定義にはそのような抜け穴が存在しないのではないか
0729デフォルトの名無しさん2013/03/11(月) 18:01:03.80
テストが要るほどに非自明な関数はトップレベルに定義すればよい
0730デフォルトの名無しさん2013/03/11(月) 18:11:01.15
テストが困難になるのは使い道が無数にある場合だから
一回ぐらいしか使わないローカル関数のテストは難しくない
0731デフォルトの名無しさん2013/03/11(月) 18:15:33.54
ghc-modでローカル定義拾うのあるし
GHCにも穴はあるんだよ多分
0732デフォルトの名無しさん2013/03/11(月) 19:41:39.12
>>726
関数内で関数定義する場合に、
どういうテストが不可能だと言っているの?
0733デフォルトの名無しさん2013/03/11(月) 19:49:03.11
>>731
ローカル変数は、名前とソースの位置が同じだが値が異なる変数を何個も定義できるよ
トップレベルの変数を一個拾うのとは全然違う
0734デフォルトの名無しさん2013/03/11(月) 23:19:17.34
関数内関数までテストしたくないです
理由は、関数内関数には外部から見える仕様が存在しないからです
0735デフォルトの名無しさん2013/03/12(火) 07:57:44.38
大元の関数をテストすればいいんじゃないの?
0736デフォルトの名無しさん2013/03/12(火) 08:43:58.57
内部関数というのは、他の言語で言えばコードブロックみたいなものだからね
コードブロックの一つ一つまでテストする必要はないし、テストの必要があるほど大きなブロックなら独立させればいい
0737デフォルトの名無しさん2013/03/12(火) 08:58:22.30
Smalltalkだとメソッド内ブロック使わないと何もできない
その後、OOPにブロックは不要という考え方が定着し
OOPと関数型は完全に分裂した
0738デフォルトの名無しさん2013/03/12(火) 09:36:49.37
>>737
最近のOO言語はやっぱりクロージャが必要って流れになってるよ。JavaもC++も。
0739デフォルトの名無しさん2013/03/12(火) 10:43:28.34
三大やっぱり必要
テスト
public
lambda
0740デフォルトの名無しさん2013/03/12(火) 10:55:43.66
リフレクションかな
haskell-src-extsとか使ってローカル定義を参照できるようなツールがあればいける
0741デフォルトの名無しさん2013/03/12(火) 11:55:07.13
>>740
全力で成功を回避しろ
0742デフォルトの名無しさん2013/03/12(火) 12:41:31.93
>>737
その場合、SmalltalkはOOPと関数型のどっちの所属なんだ?w
今でもSmalltalkはブロックがないと何もできないわけだが。
0743デフォルトの名無しさん2013/03/12(火) 13:02:36.67
特定のクラスに所属しないユニバーサルな関数はOOPとは相性が悪い
プリミティブ型がOOPと相性が悪いのと同じ理屈
0744デフォルトの名無しさん2013/03/12(火) 13:14:10.01
>>743
そんなことないよ。Javaとは相性悪いけど、OO言語だからじゃなくて、Javaが糞だから。
0745デフォルトの名無しさん2013/03/12(火) 19:39:31.34
>>743
SmalltalkのクロージャーはSmalltalkと相性悪いの?
Smalltalkってクロージャーがないと条件分岐すらできないんだけど?
0746デフォルトの名無しさん2013/03/12(火) 19:53:49.06
HaskellとSmalltalk、唯一の共通点はモヒカンっぷり
0747デフォルトの名無しさん2013/03/12(火) 21:36:09.68
HaskellとSmalltalkはモヒカンの中でも最弱・・・
本物のモヒカンは静的型とGUIを否定する
0748デフォルトの名無しさん2013/03/12(火) 21:40:50.33
いまだにモヒカンの定義が良く分からんのだよなあ
0749デフォルトの名無しさん2013/03/12(火) 22:20:34.02
良く分からないものの擬人化
モヒカンの陰謀か何かで、分かるはずのものが分からなくなる
0750デフォルトの名無しさん2013/03/13(水) 01:52:45.11
>>745
クロージャーもクラスにできるんだけど、プリミティブなくせに抽象度が違うので、これをクラスとして扱いつづけるといろいろおかしくなる
0751デフォルトの名無しさん2013/03/13(水) 18:24:51.16
>>750
BlockClosureクラスだと何がいろいろおかしくなるの?
SmalltalkってBlockClosureクラスがないと条件分岐すらできないんだけど?
0752デフォルトの名無しさん2013/03/13(水) 19:19:43.13
もしかしてJavaの.classファイルがものすごい数になるのを心配してるんじゃないか
0753デフォルトの名無しさん2013/03/13(水) 19:24:19.19
>>743
どう相性が悪いの?
カプセル化する必要のない関数はクラスに所属させる必然性はないけど
それがOOPの妨げになる理由は?
それにnamespaceとかあるよね?
そのレスただ言いたかっただけに見えるよ
0754デフォルトの名無しさん2013/03/13(水) 20:37:45.01
クロージャをクラスにしても問題ないだろう
単にJavaみたいに1クロージャを1クラスに対応させるのが腐れなだけ
クロージャをリテラルにしてどのクロージャも同じクラスになれば問題なし
■ このスレッドは過去ログ倉庫に格納されています