8
data NestedList a = Elem a | List [NestedList a]
flatten :: NestedList a -> [a]
flatten (Elem element) = [element]
flatten (List []) = []
flatten (List (first:rest)) = flatten first ++ flatten (List (rest))
main = print $ flatten $ List []

上記のコードを Haskell で書きました。たとえば、他のパラメーターを指定してこれを実行すると、

main = print $ flatten $ List [Elem 1, Elem 2]
main = print $ flatten $ Elem 1

それは与えます

[1, 2]
[1]

それぞれ。

空のリストで実行すると失敗します。

main = print $ flatten $ List []

エラーメッセージ

No instance for (Show a0) arising from a use of `print'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
  instance Show Double -- Defined in `GHC.Float'
  instance Show Float -- Defined in `GHC.Float'
  instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
    -- Defined in `GHC.Real'
  ...plus 23 others
In the expression: print
In the expression: print $ flatten $ List []
In an equation for `main': main = print $ flatten $ List []

質問

  1. なぜ失敗するのですか?どうすれば修正できますか?
  2. NestedList空の を受け入れるように定義を変更する必要がありますListか? もしそうなら、どうすればいいですか。それはかなり紛らわしいです。
4

4 に答える 4

3

[]浮動小数点数、文字列、ブール値、または実際には任意の型のリストにすることができます。したがって、printどのインスタンスshowを使用すればよいかわかりません。

エラー メッセージにあるように実行し、 のように明示的な型を指定し([] :: [Int])ます。

于 2013-09-04T13:59:30.943 に答える