[過去ログ] 関数型プログラミング言語Haskell Part16 (978レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
779: 767 [sage] 2011/12/21(水) 21:02:56.56 AAS
>>770,771,772,778770(1): デフォルトの名無しさん [sage] 2011/12/20(火) 22:55:42.52 AAS
>>767
めっさ力技
data Pos = F | M | E deriving Show
getPos :: Eq a => [a] -> [a] -> a -> (Maybe Pos)
getPos listA listB = fmap f . (`lookup`listE) where
listC = map (`elem` listB) listA
listE = zip listA $ zip listC $ scanl1 (||) listC
f (True,_) = M
f (False,False) = F
f (False,True) = E
listA = [0,1,2,3,4]
listB = [2,3,1]
x=0
main = do
let g = getPos listA listB
print $ g 0
print $ g 1
print $ g 2
print $ g 3
print $ g 4
771(4): デフォルトの名無しさん [sage] 2011/12/20(火) 23:35:56.81 AAS
>>767
1. listAをlistA1 ++ [x] ++ listA2にわける
2. listA1とlistBのintersectionを取って判定
f listA listB x =
if y == 0 then 1 else if y == length listB then -1 else 0
where y = length $ takeWhile (/= x) listA `intersect` listB
772(1): デフォルトの名無しさん [sage] 2011/12/21(水) 01:20:13.13 AAS
>>767
f listA listB x = (elem x as, elem x listB) where as = takeWhile (not.flip elem listB) listA
まさかこんなに素早く返事があるとは思ってなくて
反応遅れました。すみません。
具体的なコード例までわざわざありがとうございます。
見事に誰一人としてelemIndexなんて使ってないですね……。
順序を調べる、という発想自体を捨てないと駄目だということが
よくわかりました。
>>775
個人的には770さんの例以外は見て何をしているかは
すぐ把握できました。
>>776
777さんが返してくれていますが、listAは整列とは限らないです。
listAの位置に基づいてlistBをソートすれば、listBは確かに連続
部分列になります。
というわけで、どうも皆さんありがとうございました。
上下前次1-新書関写板覧索設栞歴
あと 199 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.018s