Haskell — выводит тип, который принимает 2 параметра

#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
  

Но в этом нет необходимости.