[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 10/27 09:49 / Filesize : 225 KB / Number-of Response : 933
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 16:41:29 ]
haskell.org
www.haskell.org/

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

過去ログ
関数型プログラミング言語Haskell
Part1 pc.2ch.net/tech/kako/996/996131288.html
Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 pc11.2ch.net/test/read.cgi/tech/1193743693/
・2chの仕様により、行頭の半角スペースは表示されません。
 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。


797 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:03:06 ]
べつにPtrを経由しなくても>>794の方針でいけるよ
効率を気にするなら別だけど

798 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 00:27:22 ]
Ptrを経由しないとバイナリ表現のFloatから
HaskellのFloatを得る手段が難しいよ。
thread.gmane.org/gmane.comp.lang.haskell.cafe/44845/focus=44927

799 名前:初心者修業中 mailto:sage [2008/10/02(木) 00:56:54 ]
>>797
テキストモードの場合、、
control-ZをEOFと認識したり、CRLFを LFに変換すると
GHCのマニュアルにありますが、
問題ないのでしょうか?

800 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:06:55 ]
>>799
問題ある
>>797は、バイナリモードで開いた上でgetContentsすればいい、という意味で言った

>>798
確かにそうだな
ちゃんとテストしてないけど一応こんなんでいけるみたいだ

import Data.Bits
import Data.Word

w32ToFloat :: Word32 -> Float
w32ToFloat w
  | ep == 255 && sf /= 0 = 0 / 0
  | sf == 255 = sign / 0
  | sf == 0 && ep == 0 = sign * 0
  | otherwise = sign * encodeFloat r e
  where
    sn = shiftR w 31
    ep = shiftR w 23 .&. 0xff
    sf = w .&. 0x7fffff

    sign = if sn == 1 then -1 else 1
    e = fromIntegral ep - 127 - 23
    r = fromIntegral sf + 0x800000


801 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 01:37:29 ]
バイト列をFloatとして解釈させたいわけだから、
必要なのは Word32 -> Float じゃなくて [Word8] -> Float なんじゃなかろうか。
というわけでPtr経由だけど書いてみた。

import Foreign

fromBytes :: Storable a => [Word8] -> a
fromBytes bs = unsafePerformIO $ allocaArray (length bs) $ \ p -> pokeArray p bs >> peek (castPtr p)

toBytes :: Storable a => a -> [Word8]
toBytes x = unsafePerformIO $ alloca $ \ p -> poke p x >> peekArray (sizeOf x) (castPtr p)

toBytes (0.5 :: Float) => [0,0,0,63]
fromBytes [0,0,0,63] :: Float => 0.5

802 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 09:32:32 ]
で、整数のendianはどうするとか色々とケチがついていくにしたがって、重くて遅いコードに変身していくわけだ。

803 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 10:50:10 ]
endian変更は[Word8]にreverseかければ良いんじゃね。

システムのendian判定はこんな感じ?
isLittleEndian = (1 :: Int) == fromBytes [1,0,0,0]
isBigEndian = (1 :: Int) == fromBytes [0,0,0,1]

804 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 13:03:52 ]
やっぱり>>800にはバグがあった
-  | sf == 255 = sign / 0
+  | ep == 255 = sign / 0

>>802
[Word8]からWord32を作って、そこからFloatにすればシステムのendiannessを気にする必要ないよ
この場合PtrやUArrayを経由するのでもencodeFloatでも良い

805 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:35:05 ]
-- テストしてみた。

-- import Test.QuickCheck

(f `eq` g) x = Result (Just (f x == g x)) [] [show (f x), show (g x)]

forAllBinaryFloat :: (Testable b) => ([Word8] -> b) -> Property
forAllBinaryFloat t =
 forAll (choose (0,1)) $ \s ->
 forAll (oneof [elements [0,255], choose (1,254)]) $ \e ->
 forAll (oneof [elements [0], choose (1,2^23-1)]) $ \f ->
 t (sefToBytes s e f)

sefToBytes :: Int -> Int -> Int -> [Word8]
sefToBytes s e f = endian [shiftL s' 7 .|. shiftR e' 1, shiftL e' 7 .|. f1, f2, f3]
 where
 [_,f1,f2,f3] = endian (toBytes f)
 [s',e'] = map fromIntegral [s,e]
 endian = if head (toBytes (1 :: Word32)) == 1 then reverse else id

prop_float :: (Float -> Float) -> Property
prop_float fl2fl = forAll (oneof fls) (id `eq` fl2fl)
 where fls = [elements [0,{-0/0,-}1/0,-1/0], fmap (/ 2^127) arbitrary, arbitrary]

prop_bytes :: ([Word8] -> [Word8]) -> Property
prop_bytes bs2bs = forAllBinaryFloat (id `eq` bs2bs)



806 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 17:36:01 ]
-- quickCheck test1 や verboseCheck test5 とかで実行。

test1 = prop_float (fromBytes . toBytes)
test2 = prop_float (w32ToFloat . fromBytes . toBytes)
test3 = prop_float (uncurry encodeFloat . decodeFloat)
test4 = prop_bytes (\bs -> toBytes (fromBytes bs :: Float))
test5 = prop_bytes (toBytes . w32ToFloat . fromBytes)
test6 = forAllBinaryFloat $ \bs -> not (isNaN (fromBytes bs :: Float)) ==>
 (fromBytes `eq` (w32ToFloat . fromBytes)) bs

{- 1, 3 は通った。最初 NaN/=NaN をうっかりした。
w32ToFloat は非正規化数を無視してるので、2, 5, 6 が通らなかった。
4 は NaN のときに、仮数部の最上位ビットがおかしくなった。
5 は w32ToFloat は NaN を全て 0/0 にするのもあって通らなかった。
NaN の表現が変わるのは Float を解釈する場面
(つまりコピーとかじゃない)なら問題無いだろうけど。-}

807 名前:デフォルトの名無しさん mailto:sage [2008/10/02(木) 21:41:10 ]
QuickCheckすげー
盲目的なランダムテストだけじゃないのな

概念的には、(ieee754で表現される)外部フォーマットのデータを読んで、
ネイティブのFloatに変換して使いたいのか、
それともieee754データとしてそのまま扱いたいのかでやることが変わってくるな
実際にはどうせieee754を採用してるアーキテクチャでしか動かさないから、ショートカットが効くわけだけど

808 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 01:51:57 ]
QuickCheckってどうも使い方が解らない。
テストが元実装と結局ほとんど同じにならない?
元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
結局同じになるのは必然だと思うんだけど。
仕様から演繹出来る他の事を確認しろって事かな?
でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?


809 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 03:06:21 ]
>テストが元実装と結局ほとんど同じにならない?
ならない。>>805-806を見れば分かる通り

>元実装は仕様をすでに表してるわけで、その仕様にあってるか確認するコードは、
>結局同じになるのは必然だと思うんだけど。
そういう場合もあるし、そうでない場合もあるから、決して必然じゃない
たとえば、ソート関数が正しいかどうか確認するコードと、
実際にマージソートやクイックソートをするコードは全然違うものになる
さらに「マージソートでもクイックソートでも結果が同じになる」みたいなのもテストになるし

>でも、演繹で導かれる事が、元仕様とは別の理由で成り立つ事もあるよね?
もちろん
だれもテストで全ての誤りを発見できるとは思ってない

810 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:26:34 ]
あと、ランダムテストが有効な場合とそうでない場合があるよね。
>>805-806はあまりランダムである必要が無いかも。
きわどいケース(上の場合だと0、非正規化数、無限大、NaN)を
並べ上げにくい場合にランダムテストが有効な気がする。

811 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:35:10 ]
ああそうか、例えばソートの例の場合、
「正しくマージソート出来てるか」じゃなくて
「正しくソート出来てるか」のテストになるからか。

前者はQuickCheckに関わらず外部テストでは確かめようがないから、
「ソートする」じゃなくて「マージソートする」という仕様はソースレビューするしかないのか。

812 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:36:28 ]
単なる関数じゃあまり意味がなくて、
結果としてのアウトプットが特徴的で綺麗な性質を持ち、
かつ、その性質自体が目的である場合に威力を発揮するって感じか。
その類の物は、性能が競われる事が多い気がするから、その辺りのサポートもあると良いかも。

813 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:38:09 ]
2chって連続した半角スペースが に置換されるようになったの?

f :: A -> B のテストは
・B (or A) の == を使う場合
  ・一般の場合
    ・h :: A -> B を用意して f x == h x をテスト
  ・逆関数 g :: B -> A がある場合
    ・x == g (f x) をテスト
    ・y == f (g y) をテスト
・使わない場合
  ・r :: A -> B -> Bool をうまく用意して r x (f x) をテスト
(テストはランダムな x :: A, y :: B に対して)
大概こんな感じ。

元実装とほとんど同じテストってのは、
g やうまい r が無くて、f x == h x というテストしか無いんだけど、
f と違う h も無くて、でも f x == f x じゃバカ丸出しなので、
== を明示的には使わないで実質的に f x == f x と同じことをやる、
みたいな感じじゃないかな。

814 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:39:53 ]
うわ俺バカ丸出し。 って書きたかった。

815 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:31:09 ]
datを直接見るようにすればnbspなんて使わなくてもインデントされるよ



816 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 12:19:55 ]
滅茶苦茶な事を聞いていそうで済みませんが、
cabal configure と runhaskell Setup.hs configure、
cabal build と runhaskell Setup.hs build、
cabal install と runhaskell Setup.hs install、
って何か違うんでしょうか。
同じだとしたらなんのために両方あるんでしょうか。

817 名前:初心者修業中 mailto:sage [2008/10/08(水) 15:33:21 ]
>>816
・runhaskell はHaskellのソースプログラムを実行するコマンド
・cabal はパッケージをインストールするコマンド
…と認識しています。

参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224

818 名前:デフォルトの名無しさん mailto:sage [2008/10/08(水) 23:08:47 ]
オラ本でねーぞコラ


819 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 00:31:08 ]
cabal なんてコマンドあるの?
あるとしたら runghc Setup と打つより楽だからじゃ?

820 名前:初心者修業中 mailto:sage [2008/10/09(木) 01:00:41 ]
>>819
参考

ttp://haskell.g.hatena.ne.jp/illillli/20080224
cabal-installというパッケージにcabalというユーティリティがあった。
パッケージのダウンロードからインストールまでを自動化してくれるようだ。

821 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:00:42 ]
今んとこ、RubyGemsを目指して整備中って事で、
最終的にSetup.hsはなくなるかオプショナルになってcabalコマンドに統一されるんじゃない?
page.freett.com/shelarcy/log/2007/diary_03.html#when_we_can_use_caball-install
hackage.haskell.org/trac/hackage/wiki/RubyGems

現時点でのそれら重複してるコマンドの詳細は判らないけど、installについては、
cabal install monadius
monadius
で遊べるってのは、Setup.hsでは無理だろう。


822 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 04:20:27 ]
>>821
RubyGemsなんて目指されると非常に困る。

823 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 12:13:24 ]
ん?どんな風に?

824 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 18:45:20 ]
質問です。
Haskellにて、二次元配列を時計回りに90度回転させるには、どうすればいいでしょうか?

今あるコードが
rot90 list = reverse (map (head) list) : rest
where rest = if length (concat taillist) == 0 then []
else rot90 taillist
where taillist = map tail list
ですが、ものすごく非効率的だと思います。

825 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:03:11 ]
>>824
length (concat taillist) == 0
の部分を
all null taillist
にでもすれば別に非効率的でもない気がする

俺ならtransposeを使うな
rot90 = transpose . reverse



826 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:24:00 ]
>>825
素早い回答ありがとうございます。
実は、transposeも定義しないといけなく、transposeでrot90を使っているので…。

transpose list = rot90 (hflip list)
hflip list = reverse list

というふうになっております。

827 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:39:20 ]
どうしてもrot90でtransposeを定義しなきゃいけないの?
そうでなくて単にtransposeが必要ってだけならその定義は捨てて
import Data.Listしてtransposeを使えば良いんじゃない?

828 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:45:38 ]
transposeって標準の関数ではないんですか?

829 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 19:53:59 ]
>>827

課題では、自分でtransposeを定義しろ、とのことでした。

830 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 20:20:13 ]
>>828
Prelude関数ではないのでData.Listをインポートしないと使えない。

>>829
だったら >>825 が最初に言ってる変更をするか、rot90を使わずにtransposeを定義すれば。

831 名前:デフォルトの名無しさん mailto:sage [2008/10/09(木) 21:12:45 ]
Data.Listのtransposeはこれ
transpose :: [[a]] -> [[a]]
transpose [] = []
transpose ([] : xss) = transpose xss
transpose ((x:xs) : xss) = (x : [h | (h:t) <- xss]) : transpose (xs : [ t | (h:t) <- xss])

832 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 06:57:02 ]
>>813
連続した半角スペースはjavascriptモードで書き込むときに置換されるらしい。

>>824-825
長方形じゃないときに、all だとエラー、any だと長方形になるように切り落とす。
filter 使えば>>831の transpose に map reverse . したような感じになる。
([<h or t> | h:t<-xss] = map <head or tail> (filter (not.null) xss))

違ったやり方なら
rot90 = foldl c []
 where
  c yss [] = yss
  c [] xs = [[x] | x<-xs]
  c (ys:yss) (x:xs) = (x:ys) : c yss xs
とか。

833 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 07:01:54 ]
あ、any じゃ list == [] のときまずいという話もあるか。

834 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 00:49:41 ]
>>823
パッケージの管理方法にいろいろと問題がある。

835 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 01:26:24 ]
>>834
具体的に言ってくれよ。そして開発者達にも。



836 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 20:53:56 ]
質問です。ディレクトリの階層構造をData.Tree型に納めようとしてい
るのですが、遅延評価が効くようなコードが書けません。
type FileTree = Tree FilePathとして、以下のような関数を作ってみたのですが。
recursiveFileTree :: FilePath -> IO FileTree
recursiveFileTree name = do
 contents <- catch (getDirectoryContents name) (\e -> return [])
 children <- let
  filtered = filter filterDots contents
  pathadd = map (\x -> name </> x) filtered
  mapped = map recursiveFileTree pathadd
  in sequence mapped
 return (Node (takeFileName name) children)
  where filterDots :: FilePath -> Bool
   filterDots "." = False
   filterDots ".." =
   filterDots _ = True
(インデントしてるように見せるために全角スペースを入れています。見えますか?)
おそらくsequenceで[IO FileTree] -> IO [FileTree]としているあたりが問題なのだと思いますが、解決策が分かりません。

837 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:14:59 ]
・unsafeInterleaveIOを使う
・Data.Treeを使うのをやめて、明示的なIOを伴う木を定義して使う

好きな方を選んでくれ

838 名前:デフォルトの名無しさん mailto:sage [2008/10/27(月) 22:22:13 ]
一応言っておくが、HaskellのIOは基本的に遅延しないし、普通はそれで正しい
IOは実行順が重要なことが多く、遅延させて順番をうやむやにすると厄介なことになりやすい
それだとどうしても不便というときのためにunsafeInterleaveIOがある

839 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 10:12:08 ]
f a b c の部分適用として f a b と書くことはできますが、(\a -> f a b c) にあたる部分適用を a を省略して書く方法はありますか?

840 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 11:26:17 ]
flip使え

841 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 17:56:42 ]
flip (flip f b) cはさすがに悪趣味だろ

842 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 18:02:48 ]
(\a -> f a b c) → 15文字
flip (flip f b) c → 17文字

843 名前:デフォルトの名無しさん [2008/10/30(木) 19:39:38 ]
($c).($b).f flip (`f`b) c

844 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:45:59 ]
こんなのもありました。

(flip.(flip f)) b c

3引数flip
haskell.g.hatena.ne.jp/mr_konn/20061223/1166869265

845 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 19:54:21 ]
>>844>>841 の変形だね。
あと、内側の括弧は無くてもOK



846 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 21:45:30 ]
f # b c みたいな構文(# は未適用引数を表す)があったら便利だったかもね

847 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:03:15 ]
SRFI 26 みたいな?

848 名前:デフォルトの名無しさん mailto:sage [2008/10/30(木) 23:47:19 ]
\x->f x b c

849 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 08:29:54 ]
>>848
>>839

850 名前:デフォルトの名無しさん mailto:sage [2008/10/31(金) 11:19:22 ]
>>846
それだと
f # b c -- \a -> f a b cと同等

(f #) b c -- (\a -> f a) b cと同等
を区別する必要が出てきて面倒だな

851 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:03:16 ]
d.hatena.ne.jp/m-hiyama/20081031/1225416719
ブログ持ってないのでここで。酒井さんのパクリ。

{-# OPTIONS -fglasgow-exts #-}

import Control.Monad (liftM2)
import Data.Either
import Test.QuickCheck


infix 4 :<->:
type a :<->: b = (a -> b, b -> a)

(.>) :: a:<->:b -> b:<->:c -> a:<->:c
(f1,g1) .> (f2,g2) = (f2 . f1, g1 . g2)

un :: a:<->:b -> b:<->:a
un (f,g) = (g,f)


type a :+: b = Either a b
infixr 5 :+:

alt :: a:+:b :<->: b:+:a
alt = (f,f) where f = either Right Left

swap :: a:+:b:+:c :<->: b:+:a:+:c
swap = (f,f) where f = either (Right . Left) (either Left (Right . Right))

rt :: b :<->: c -> a:+:b :<->: a:+:c
rt (f,g) = (r f, r g) where r = either Left . (Right .)

852 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:04:16 ]
data T = L | N T T deriving (Eq, Show)

fold :: a:+:(T,(T,a)) :<->: (T,a)
fold = (f,g)
 where
 f (Left a)            = (L,a)
 f (Right (t1,(t2,a))) = (N t1 t2,a)
 g (L,a)       = Left a
 g (N t1 t2,a) = Right (t1,(t2,a))

h :: (T,a) :<->: a:+:(T,a):+:(T,(T,(T,a)))
h = un fold .> rt (un fold)

s :: a:+:(T,(T,(T,a))) :<->: (T,a):+:(T,(T,(T,(T,a))))
s = rt (un fold .> alt) .> swap .> rt fold .> alt

853 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:05:44 ]
st :: (T,a) :<->: (T,(T,(T,(T,(T,(T,(T,a)))))))
st =
 -- T
 h
 -- 1 + T + T^3
 .> swap
 -- T + 1 + T^3
 .> rt (s .> s .> s .> s
 -- T + T^4 + T^7
       .> alt)
 -- T + T^7 + T^4
 .> swap
 -- T^7 + T + T^4
 .> rt (s .> s .> s .> s .> s)
 -- T^7 + T^6 + T^9
 .> swap
 -- T^6 + T^7 + T^9
 .> un h
 -- T^7

854 名前:デフォルトの名無しさん mailto:sage [2008/11/02(日) 13:08:02 ]
instance Arbitrary T where
 arbitrary = oneof [return L, liftM2 N arbitrary arbitrary]

main :: IO ()
main = do
quickCheck $ \x -> x == (snd st (fst st x) :: (T,()))
quickCheck $ \x -> x == fst st (snd st x :: (T,()))


型検査で漏れてるのは fold の定義ぐらいで、QuickCheck 意味ないのかも。

855 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:50:00 ]
すげえ、読みやすいな



856 名前:デフォルトの名無しさん [2008/11/05(水) 07:40:02 ]
GHC 6.10.1リリースあげ

857 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 08:34:43 ]
((f.) . g) a b
みたいなテクニックが沢山載ってるようなページを教えてください

858 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:06:08 ]
unsafeInterleaveIO :: IO a -> IO a
unsafeInterleaveIO (IO m)
= IO ( \ s -> let
r = case m s of (# _, res #) -> res
in
(# s, r #))

この#って何なんですか?ghc6.8.2ではエラーになりますし…

859 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 12:38:02 ]
>>858
unboxed tupleってやつだね。
itpro.nikkeibp.co.jp/article/COLUMN/20070206/260872/?ST=develop&P=2

>>856
Windows版を入れてみたんだけど、ライブラリの置き場所がキモイな。
6.8だと$topdir/lib以下に入ってたのが6.10.1だと$topdirに入ってる。
キモイし$topdirの見通しも悪いので6.8と同じように$topdir/libの中に移動して
package.confの中の$topdir\\を$topdir/lib\\に全置換した。

860 名前:デフォルトの名無しさん mailto:sage [2008/11/05(水) 14:29:51 ]
>>859
ありがとうございました
拡張構文なんですね

861 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:45:00 ]
weakリダクションって何?

862 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:10:49 ]
googleで検索したらひっかかったので、ここに書かせていただきます。質問していいでしょうか?

Haskellの処理系だけを使って、prologみたいなことができないか調べています。
↓でprologのタプル parent(tom, bob). のような感じにすると、

parent::[Char]->[Char]->Bool
parent "tom" "bob" = True
parent "liz" "bob" = True
parent "mike" "liz" = True
parent _ _ = False

とりあえず、
main = print $ parent "tom" "bob"
main = print $ parent "mike" "bob"
で True や False が出て、prologっぽくなります。

そこで、
parent X "bob"
という質問に対し、
X=tom
X=liz
みたいに変数にユニファイするような定数を手に入れるような仕組みってあるでしょうか?

入門書に、コンパイル時に内部でグラフを作るみたいな話が書いてあったので、
そのグラフを参照できるようなことができれば実現できると思うのですが、無理でしょうか?

863 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:23:23 ]
>>862
無理
Haskellの関数は文字通り関数なので、引数を放り込んで結果を観察する他に使い道は無い

864 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 00:43:20 ]
中間形式のグラフみたいなの見れないのん?

865 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:15:29 ]
中間形式のグラフって何?
グラフ簡約のことを言ってるのなら、グラフが作られるのは実行時だし、
要するに「未評価の式」を表してるだけだから、それを見ても>>862みたいなことをする助けにはならんよ



866 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:27:35 ]
少なくとも書こうとしてるプログラムの中からは見れない。
Haskellって厳格な言語で、その手の変なことは基本的にできないよ。
何をやりたいのか知らないけど、インタプリタ的なものを書いて、
それをライブラリとして使えば?

867 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:38:05 ]
ん、普通にMaybeとかそれ以前にListモナドとか使えば普通に実現出来るって云うかモナドのすべて読んだ方が良いと思うよ

868 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 02:16:43 ]
関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照するという話と、
先にグラフを作って、実行時に、そこにデータを流し込むような感じの説明があったから、
処理系をそのまま利用して、かなり高速なデータベースが作れると思ったんですけどダメですかね。

実現できればprologよりも表現能力が高いから面白そうだと思ったんですが。

869 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 03:27:38 ]
>関数から引数への参照は、関数が展開されても複数の場所から同じ場所を参照する
これはその通り

>先にグラフを作って、実行時に、そこにデータを流し込む
これはぜんぜん違う
多分どこかで誤読してると思う

870 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:40:05 ]
>>867
zs <- everything
append [1..100] [1..100] zs
こういうやり方じゃ生きてるうちに終わらないかもよ。
Listモナドは、もちろんユニフィケーションや制約伝播なんて無くて、
総当りで解を求めようとする非決定性計算ってだけなんで。

871 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 11:50:02 ]
yet another embedding of pure Prolog into Haskell
okmij.org/ftp/Prolog/Arithm/DefinitionTree.hs

いまいち使い方はわからんけど、ググったら見つかったので貼っておく。

872 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 20:48:35 ]
>>870
failや[]で枝狩り


873 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 00:44:22 ]
>>872
変数をどう表現して、何をどう枝刈るの?


874 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 08:25:24 ]
887 名前:デフォルトの名無しさん[] 投稿日:2008/11/22(土) 00:28:37
Real World Haskellは糞本だと思う

875 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:49:16 ]
出版されたの?



876 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:01:38 ]
出版されたかは知らないけど訳してる人がいる
ttp://d.hatena.ne.jp/mokehehe/20081124/rwh

877 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:27:23 ]
始まったばかりにしても、ひでえ訳

878 名前:デフォルトの名無しさん [2008/11/25(火) 23:41:58 ]
Real World Haskellって翻訳本が出ると思いますか?
マイナーな言語だけど、微妙にブームになってるし
来年ぐらいに出版されたりするかなあ?

879 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 23:48:26 ]
確かに一時期あったけど、とっくに沈静化したような…>ブーム

880 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/25(火) 23:50:52 ]
>>879
最近は沈静化したように見せかけて、ジワジワきてるよ。
各大学の卒研レベルではHaskellやったりしてるところが増えてきてる。

881 名前:デフォルトの名無しさん [2008/11/26(水) 00:04:13 ]
うーん、訳の出来とは別になんか期待できなさそうな感じ


882 名前:a36 ◆K0BqlCB3.k mailto:sage [2008/11/26(水) 00:08:27 ]
原文自体平易な英文なので今後のことを考えるなら英文に慣れるために原文で読むことをお勧めします。

883 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:12:16 ]
まだ10章までしか読めてないけど
ふつケルの次くらいに読む分には悪くないと思う>RWH

タダだし

884 名前:デフォルトの名無しさん [2008/11/26(水) 00:17:39 ]
本買おうと思ったけど、WEBで読めるわけだし
翻訳本が出るまでそれですまそうかなw

885 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:19:34 ]
RWHクソだろ〜
11章からはページを増やすためにネタを書きましたって
レベルのオナねたのオンパレードだぞ



886 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:36:34 ]
RWHってネットでもう出回ってるんだなw

887 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 00:45:56 ]
出回ってるつーかあれを最近本にしたんでしょ?

888 名前:デフォルトの名無しさん [2008/11/26(水) 00:49:09 ]
存在型ってなんですか?

889 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 01:23:56 ]
バキシルとか大麻のことだ

890 名前:デフォルトの名無しさん [2008/11/26(水) 01:48:33 ]
ありがとうございます。

891 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 07:48:38 ]
>>888
Cardelli読め

892 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 13:02:02 ]
Haskell: The Craft of Functional Programming

Programming in Haskell
のどちらがお勧めですか?ふつけるの次くらい。

893 名前:デフォルトの名無しさん mailto:sage [2008/11/26(水) 21:24:32 ]
>>884
下手糞な翻訳の恐れ大。最近多いね、いや昔からか

894 名前:デフォルトの名無しさん [2008/11/26(水) 22:52:49 ]
Programming in Haskellはいいよ。ふつけるの前でもいいです。

895 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:14:12 ]
>>892
自分はふつけるの後にCraftでした。というか、その間にSICPが
あるので、あんまり参考にならないかな。ふつける読んでも
ちょっとピンとこなかったんですね、よくまとまってるとは思うのですが。

自分は普通の文系プログラマで、関数型プログラミングの世界とは
無縁だったので、SICPをくぐる必要があったと感じてます。




896 名前:デフォルトの名無しさん [2008/11/27(木) 19:30:50 ]
Craftはいつ第3判が出るのですか?

897 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 19:55:34 ]
Craft第2版以降で目立ったHaskellの技法というと、Arrowぐらいでしょうか。

あとはReal Worldみたいな実用面を書いたものになりますかね。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<225KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef