1

私はこのデータ型を持っています:

data Node a = Node
    { label :: a,
        adjacent :: [(a,Int)] } deriving (Show, Eq)
data Network a = Graph [Node a] deriving (Show, Eq)

Graph をノードのリストに変換する関数があります。

deGraph :: ([Node a] -> Network a) -> [Node a] -> [Node a]  
deGraph _ x = x
 for example : 
Main> deGraph Graph [ ( Node 'a' [ ( 'b' , 3 ) , ( 'c' ,2 ) ] ) , ( Node 'b' [ ('c' , 3 ) ] ) , ( Node 'c' [] ) ]
[Node {label = 'a', adjacent = [('b',3),('c',2)]},Node {label = 'b', adjacent = [('c',3)]},Node {label = 'c', adjacent = []}]

しかし、次のような関数内で関数を使用すると:

func1 (Graph x) = deGraph (Graph x)

このエラーが発生します:

ERROR "./Network.hs":14 - アプリケーションのタイプ エラー * 式 : deGraph (Graph x) 用語 : グラフ x タイプ : ネットワーク b *不一致 : [ノード a] -> ネットワーク a

この問題を解決する方法を教えてください。

4

2 に答える 2

4

関数deGraphには 2 つの引数があり、単純に 2 つ目の引数を返します。

おそらく代わりにこれが必要です:

deGraph :: Network a -> [Node a]
deGraph (Graph x) = x

GHCi での呼び出しが機能するのdeGraphは、括弧と次のリストを囲むのを忘れているためですGraph。したがって、これも 2 つの引数を持つ呼び出しです。ではfunc1、(正しく) 括弧を使用していますが、一貫性がないため、型エラーが発生します。

于 2013-04-19T09:20:05.810 に答える