#haskell
#haskell
Вопрос:
Я пытаюсь создать массив своего собственного типа letterCount
в виде [(‘letter’,occurence),(),…] . Как я могу создать вывод типа, который принимает 2 параметра. Вот мой код:
type LetterCount = (Char,Int)
letterOccur :: Char->[Char] -> Int
letterOccur c [] = 0
letterOccur c (x:xs) = if (c == x) then ((letterOccur c xs) 1)
else letterOccur c xs
letterStats :: [Char] -> [LetterCount]
letterStats :: [] = []
letterStats (x:xs) = [x,(letterOccur x (x:xs))] letterStats xs
Комментарии:
1.
map (head amp;amp;amp; length) . group . sort
2. Стрелки @karakfa могут быть не лучшей концепцией для начинающих.
3. Хорошо, тогда замените на
x -> (head x, length x)
4. Похоже, это опечатка. Просто сделайте
[(x, letterOccur x (x:xs))]
.5. @Rhymoid: правильно, кто бы бросил стрелу ? … если серьезно, я бы сказал, что имеет смысл учить новичков
amp;amp;amp;
и***
, хотя, возможно, только с упрощенной подписью(a->b) -> (a->c) -> a->(b,c)
.
Ответ №1:
Я предполагаю, что вы пытаетесь сделать что-то вроде этого:
letterStats :: [Char] -> [LetterCount]
letterStats :: [] = []
letterStats (x:xs) = (x, ( 1) $ letterOccur x xs) : letterStats xs
Все, что вам нужно сделать, это добавить 1, поскольку вы не учитываете x при проверке xs для всех x случаев. Также вы хотите вернуть список типа letterCount, который является кортежем, а не списком, поэтому я изменил
[x, letterOccur x xs] letterStats xs
Для
(x, ( 1) $ letterOccur x xs) : letterStats xs
Хотя вы также могли бы сделать это:
[(x, ( 1) $ letterOccur x xs)] letterStats xs
Но в этом нет необходимости.