[過去ログ]
関数型プログラミング言語Haskell Part33 (1002レス)
関数型プログラミング言語Haskell Part33 http://mevius.5ch.net/test/read.cgi/tech/1581326256/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
552: デフォルトの名無しさん [sage] 2020/11/02(月) 21:44:04.17 ID:aBc5dqas こうすりゃ無理やり通すことはできるけど、 そもそもパーサ同士の足し算等々でどう動いて欲しいのか分からんから まともなインスタンス宣言が書けん {-# LANGUAGE FlexibleInstances #-} instance Num (Parser Int) where x + y = x x * y = x abs x = x signum x = x negate x = x fromInteger n = return 0 http://mevius.5ch.net/test/read.cgi/tech/1581326256/552
553: デフォルトの名無しさん [sage] 2020/11/02(月) 23:56:16.57 ID:Zq9JUsOb >>552 元は別スレに出てた問題で 「与えられた文字列の中で“trickと"treat”どっちが先に出てくるか判定せよ」 なんです とりあえずparserを与える関数として makeP = mconcat . map ( manyTill anyChar . char ) でできました コレを例えば"abc"にapplyするとmtl = manyTill、ac=anyCharとして (mtl ac $ char 'a') <> (mtl ac $ char 'b') <> (mtl ac $ char 'c'> というparserになりコレにhiajklbcnという文字列をparseするとhijklとabcが出現するするまでに読み飛ばした文字列を返してくれます それでお題の答えとしてparseの結果を lastInd x s = case ( runParser ( makeP x ) () "" s ) of Left _ -> ( [ 2, 0 ] , x ) Right y -> ( [ 0, length $ x ++ y ], x ) のようにしてlengthで数えたんです しかしちょっと冗長なかんじがします そもそも読み飛ばした文字列なんか欲しいわけではなく読み飛ばした文字数が欲しいだけだからほんとは Parser String 型ではなく例えば length <$> ( manyTill anyChar ( char 'x') とかのParser Intで十分です 問題はコレをどうやって繋げて総和を返すコンビネータを作ろうかというところなんです Parser Stringはmonoid型を持ってるのでmconcat一発で繋げられるんですがParser IntはNum持ってないのでsum一発で繋げるというわけにはいかないんです なんとかできないかと探してみるとなんか「Numをderivingする」という記事を見つけて、お、コレでいけないかと色々やってみたんですがやはりParser Intにderiving一髪でNum入れる方法見つからなくてなんとかならんもんかと http://mevius.5ch.net/test/read.cgi/tech/1581326256/553
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.046s