2017-11-22 7 views
0

私はここに私はこれまでのところ(ポルトガル語の単語のxDのため申し訳ありませんが)持っているものだ、まだ系図ツリーに取り組んで、疑問を持っている:Haskellのカスタムショーインスタンス

data Familia = Node String [Familia] 

instance Show Familia where 
    show (Node a b) = show a ++ "\n\t" ++ show b 
raiz :: String -> Familia 
raiz n = (Node n []) 

juntar :: String -> String -> Familia -> Familia 
juntar a b (Node c l) 
     | b == c = (Node c (l ++ [raiz a])) 
     | otherwise = (Node c (juntarAux a b l)) 

juntarAux :: String -> String -> [Familia] -> [Familia] 
juntarAux a b [] = [] 
juntarAux a b [(Node x l)] 
     | x == b = [(juntar a b (Node x l))] 
     | otherwise = [(Node x (juntarAux a b l))] 
juntarAux a b ((Node x l):xs) 
     | x == b = (juntar a b (Node x l)):xs 
     | otherwise = (Node x l):(juntarAux a b xs) 

これが道を働いていますだから

Bob 
    John 
     Ruth 
    Hank 

*Main> let f = raiz "Bob" 
*Main> let g = juntar "John" "Bob" f 
*Main> g 
"Bob" 
    ["John" 
    []] 

そして、何私が欲しいので、同じようにそれを印刷するには、次のとおりです。私はそれが、事は、これは私の現在の出力がされたいです家族の根はボブ、ボブの息子はジョンとハンク、ジョンはルースと呼ばれる娘がいる。

私はそれを私は他の記事で見たもので、いくつかの方法をやってみたが、これは最新の試みです:

t4.hs:14:77: 
Couldn't match type ‘Familia’ with ‘[a0]’ 
Expected type: [[a0]] 
    Actual type: [Familia] 
In the second argument of ‘map’, namely ‘b’ 
In the second argument of ‘($)’, namely 
    ‘map (unwords . map show) b’ 

任意のアイデア:

instance Show Familia where 
    show (Node a b) = show a ++ "\n\t" ++ (unlines $ map (unwords . map show) b) 

これは私に次のエラーを与えます?前もって感謝します! :

+1

これは、構造的にはhttps://stackoverflow.com/questions/47423268/instance-show-haskell – Alec

+1

と同じ質問であると私は思っています(私はdup-hammerを使用することを躊躇しますが)。 :/stackoverflow.com/questions/47370551/haskell-show-instance-on-list)投稿した質問のコメントにリンクした –

+0

@AdamSmith良い点xDこれらの投稿を見逃していますか?うまくいけばそれから何かを得る:Dありがとう – Wireless

答えて

1

map showは、[a]の引数を期待する関数です。mapは関数とリストをとるためです。

したがって、式(unwords . map show)は、[a]の引数を期待する関数であるでもです。

したがって、式map (unwords . map show)[[a]]の引数を期待する関数である - それは機能(unwords . map show)に許容引数でなければならないので、リストは、各要素は、またリストであると予想しています。

したがって、式map (unwords . map show) bの最後の引数bは、aの場合は[[a]]である必要があります。

しかし、パターンNode a bから、bは、タイプ[Familia]であり、これは[[a]]と互換性がありません。これは、コンパイラがエラーメッセージであなたに指示しているものです。

ネストされた関数の種類と混同している場合は、通常はそれぞれを分割して各部分に名前(場合によっては種類)を付けることをお勧めします。そうすれば、間違いがどこにあるかを知ることができます。それは、ネストされたFamiliaの前にインデントを挿入していないため、上記の解決策は、あなたが後にしている結果が得られないことを

instance Show Familia where 
    show (Node a b) = show a ++ "\n\t" ++ concatSubFamilias 
     where 
     showSubFamilias :: [String] 
     showSubFamilias = map show b 

     concatSubFamilias :: String 
     concatSubFamilias = unlines showSubFamilias 

は注意してください。私はそれを読者のための練習として残す。

+0

私によく見える、ありがとう、ちょうど1つの質問、私は引用符を削除するには?いくつか試してみましたが、出力から削除できませんでした – Wireless

+1

引用符は 'show a'から来ました。 'show'関数は、一般的にユーザーフレンドリーな出力を生成するのではなく、むしろ技術的な表示を生成することを意図しています。したがって、 'show'は通常、有効なHaskellコード、または少なくともそれに近いテキストを生成します。特に ''文字列 'を表示する' 'は、文字列を二重引用符で囲みます。これを避けるには、最初に 'show'を通すのではなく、' a'を直接( 'String'のため)使います。 –

+0

ああ、ありがとうございます:D知識が不足して申し訳ありません、まだハスケル世界の初心者:p – Wireless