TEST1正しく文字列「ABCDEF」から次のような構造を生成します。(この特定の再帰関数で)定数をどのようにパラメータ化するか?
(a,(1,[0])) -- type 'a' occur 1 time in position 0
(b,(1,[1])) -- type 'b' occur 1 time in position 1
(c,(1,[2]))
(d,(1,[3]))
(e,(1,[4]))
(f*,(1,[5])) -- type 'f' is the last of the list
しかし、この結果が数6に依存し、それが文字列の非常に特定のクラスの長さである、一般的なケースでは無効。だから、
test1の内の文字列が "ABC" は、結果が間違っている代わりにある場合:
(a,(1,[0]))
(b,(1,[7]))
(c*,(1,[8]))
test1の内の文字列は、結果も間違っている "ABCDEFGH" の代わりである場合:
(a,(1,[0]))
(b,(1,[2])) -- Should be [1]
(c,(1,[3])) -- Should be [2]
(d,(1,[4])) -- ...
(e,(1,[5]))
(f,(1,[6]))
(g,(1,[7]))
(h*,(1,[8]))
addTrieWithCounterでは、この定数の代わりに(6)をparameterized function on the length of the word
と置き換えることができません。
この関数のCONTEXT。 addTrieWithCounterは、 "al alts" becamesのような特別な "ループ"に置かれます:addTrieWithCounter ... "al" 0 " - >"スペースを削除 " - > addTrieWithCounter ..." alts "3.結果は最初の文字列に揃えられます。
-- analyzing "all alts" should be obtained this result.
(a,(2,[4,0])) -- type 'a' occur 2 times in positions 3 and 0 (reversed order)
(l,(2,[5,1])) -- type 'l' (of seq "al") occur 2 times in positions 4 and 1 (reversed order)
(l*,(1,[2])) -- type 'l' (of seq "all") occur 1 time in positions 2
(t,(1,[6])) -- type 't' (of seq "alt") occur 1 time in positions 6
(s*,(1,[7])) -- type 's' (of seq "alts") occur 1 time in positions 7
これは些細なことですが、わかりません。
ご協力いただきありがとうございます。
import qualified Data.Map as M
import Text.PrettyPrint as TP
import Data.Either (either)
data Trie a b = Nil | Trie (M.Map (Either a a) (b, Trie a b)) deriving Show
-- (Just a note: Trie will be a Monoid's instance. So with "Either" it is possible to distinguish the following cases: "all" and "alliance")
-- add an element to a Trie
addTrieWithCounter
:: Ord a =>
(Trie a (Int, [t1]), Int)
-> ((Int, [t1]) -> Int -> (Int, [t1]))
-> [a]
-> (Trie a (Int, [t1]), Int)
addTrieWithCounter (t,st) f [] = (t,st)
addTrieWithCounter (Nil,st) f xs = addTrieWithCounter (Trie M.empty, st) f xs
addTrieWithCounter (Trie m,st) f [x] =
(Trie $ M.insertWith (\(c,_) _ -> (f c st,Nil)) (Left x) (f (0,[]) st,Nil) m,st + 1)
addTrieWithCounter (Trie m, st) f (x:xs) =
case M.lookup (Right x) m of -- !!!!! PROBLEM IN THE FOLLOWING LINE !!!!!
Nothing -> let (t',st') = addTrieWithCounter (Nil, 6 - length xs) f xs
in (Trie $ M.insert (Right x) (f (0,[]) st,t') m,st + 1)
Just (c,t) -> let (t',st') = addTrieWithCounter (t,st) f xs -- TO CHANGE
in (Trie $ M.insert (Right x) (f c st',t') m,st')
showTrieS f (t,_) = showTrie f t
showTrie :: Show a => (Either t t -> String) -> Trie t a -> Doc
showTrie _ Nil = empty
showTrie f (Trie m)
| M.null m = empty
| otherwise =
vcat $
do (k,(count,t)) <- M.assocs m
return $
vcat [ lparen TP.<> text (f k) TP.<> comma TP.<> (text . show $ count) TP.<> rparen
, nest 4 (showTrie f t)
]
test1 = showTrieS f1 t
where
f1 = (either (:"*") (:""))
t = addTrieWithCounter (Trie M.empty,0) f2 "abcdef"
f2 (cr,poss) st = ((cr + 1),(st : poss))
トライ内のノードに関連付けられたリストは、これまで以上の数持つことができます - トライを表示する場合すなわち、それは何を意味するのでしょうが(C、(1、[2,3,4] '示しました。 )) '? '(c、(1、[2,2,2,3]))'が表示されますか?リスト内の数字は単純にトライのノードの深さですか? – ErikR
それは可能性があります。しかし、addTrieWithCounterは特別な "ループ"に置かれ、 "all alliances"は次のようになります:addTrieWithCounter ... "all" 0 - > "スペースを削除" - > addTrieWithCounter ... "同盟" 3.発生は最初の文字列に揃えられます。 –