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 []
質問
- なぜ失敗するのですか?どうすれば修正できますか?
NestedList
空の を受け入れるように定義を変更する必要がありますList
か? もしそうなら、どうすればいいですか。それはかなり紛らわしいです。