2016-10-11 3 views
0

У меня есть следующее. Он просто проверяет, пуст ли List. Однако, если я попытаюсь запустить его с main, я получаю сообщение об ошибке. Как мне изменить функцию main, чтобы запустить ее правильно?Список данных - проверка наличия пустого списка

data List a = Nil | Cons a (List a) 

vnull :: List a -> Bool 
vnull Nil = True 
vnull _ = False 

main = do print (vnull [1,2]) 

Ошибка заключается в следующем:

Couldn't match expected type `List a0' with actual type `[Integer]' 
    In the first argument of `vnull', namely `[1, 2]' 
    In the first argument of `print', namely `(vnull [1, 2])' 
    In a stmt of a 'do' block: print (vnull [1, 2]) 
+2

'print' понадобится добавить' вывод show' в конце описания данных для 'list' – Michael

+3

Unrelated наконечника: вам не нужно' do' если вы имеют только одно действие «IO» (в вашем случае «печать»). – duplode

+4

кстати.'fromList = foldr Cons Nil' - это действительно удобная функция, когда вы делаете это так. – epsilonhalbe

ответ

1

Переход к:

main = print $ vnull $ Cons 1 $ Cons 2 Nil 

производит:

False 
1

он работает как он реализован:

vnull Nil 
True 

vnull (Cons 1 Nil) 
False 

vnull (Cons 2 (Cons 1 Nil) 
False 

... 

вы можете попробовать следующие команды в ghci, чтобы получить всю информацию о [] Тип данных:

Prelude> :t [] 
[] :: [t] 
Prelude> :i [] 
data [] a = [] | a : [a] -- Defined in ‘GHC.Types’ 
instance Eq a => Eq [a] -- Defined in ‘GHC.Classes’ 
instance Monad [] -- Defined in ‘GHC.Base’ 
instance Functor [] -- Defined in ‘GHC.Base’ 
instance Ord a => Ord [a] -- Defined in ‘GHC.Classes’ 
instance Read a => Read [a] -- Defined in ‘GHC.Read’ 
instance Show a => Show [a] -- Defined in ‘GHC.Show’ 
instance Applicative [] -- Defined in ‘GHC.Base’ 
instance Foldable [] -- Defined in ‘Data.Foldable’ 
instance Traversable [] -- Defined in ‘Data.Traversable’ 
instance Monoid [a] -- Defined in ‘GHC.Base’ 

для вашей функции применим к [] параметра вам нужно что-то вроде:

vnull :: [a] -> Bool 
vnull [] = True 
vnull _ = False 
-1

Вы можете: instance Foldeable List where foldMap f Nil = mempty foldMap f (Cons x ls) = mappend (f x) (foldMap ls) Затем используйте (fold [1,2])::List Int

+0

Класс называется «Складной». Что еще более важно, его метод 'fold' не делает то, что вы просите об этом. – dfeuer

0
List a 

и

[] 

Существуют два различных конструкторов и не тот же тип данных, функция будет работать для Сдать типа, поэтому вместо «[]» попробовать это:

vnull :: List a -> Bool 
vnull Nil = True 
vnull (Cons a expand) = False 

Затем в основной

main = do print (vnull $ Cons 1 (Cons 2 Nil)) --This is just an example you can throw in a -List a- type of any length. 

И это должно исправить это.

1

Если вы хотите, чтобы использовать тип List с обычным синтаксисом списка, вам нужно будет использовать расширения GHC.

{-# LANGUAGE OverloadedLists, TypeFamilies #-} -- at the very top of the file 

import qualified GHC.Exts as E 
import Data.Foldable 

data List a = Nil | Cons a (List a) deriving (Show, Eq, Ord) 

instance Foldable List where 
    foldr _ n Nil = n 
    foldr c n (Cons x xs) = x `c` foldr c n xs 

instance E.IsList List where 
    type Item (List a) = a 

    fromList = foldr Cons Nil 
    toList = toList 
0

Это то, что вам не хватает:

data List a = Nil | Cons a (List a) deriving Show 

fromList = foldr Cons Nil 

vnull :: List a -> Bool 
vnull Nil = True 
vnull _ = False 

main = do print (vnull $ fromList [1,2]) 

происходящий Show не нужно сейчас, но будет, когда вы на самом деле хотите, чтобы напечатать список, а не Bool. Функция fromList ничего не делает, но для преобразования Haskell Listimplementation (здесь [1,2]) в вашу собственную, поэтому вы можете называть vnull на ней. Вы могли бы также назвать

main = do print $ vnull (Cons 1 (Cons 2 (Nil)))

Смежные вопросы