Я написал программу Haskell и получил ошибку компиляции, которую я не понимаю.Понимание случая Haskell Тип-Ambiguity
Программа должна:
- Получить аргументы командной строки
- Соединить лексемы аргументы обратно к одному
String
- Читать
String
в типNestedList
данных - Свести
NestedList
вList
- Распечатать
List
К сожалению, это не будет скомпилировано из-за неоднозначности типа.
Haskell Код:
{-
Run like this:
$ ./prog List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]]
Output: [1,2,3,4,5]
-}
import System.Environment
import Data.List
data NestedList a = Elem a | List [NestedList a]
deriving (Read)
main = do
args <- getArgs
print . flatten . read $ intercalate " " args
flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (List x) = concatMap flatten x
Compile Error:
prog.hs:8:21:
Ambiguous type variable `a0' in the constraints:
(Read a0) arising from a use of `read' at prog.hs:8:21-24
(Show a0) arising from a use of `print' at prog.hs:8:3-7
Probable fix: add a type signature that fixes these type variable(s)
In the second argument of `(.)', namely `read'
In the second argument of `(.)', namely `flatten . read'
In the expression: print . flatten . read
Может кто-то помочь мне понять, как/почему существует тип неоднозначность и как я могу сделать код однозначен.
Какой тип, по вашему мнению, должен был найти GHC? – misterbee