Haskell FlatMap

Я - новичок, заинтересованный Haskell, и я пытался реализовать flatmap (>> =) самостоятельно для лучше понимания этого. В настоящее время я имею

flatmap :: (t -> a) -> [t] -> [a]  
flatmap _ [] = []  
flatmap f (x:xs) = f x : flatmap f xs  

который реализует часть "карты", но не "плоское".
Большинство модификаций я делаю результат в лишении уверенности и довольно без информации

Occurs check: cannot construct the infinite type: a = [a]  
    When generalising the type(s) for `flatmap' 

ошибка.

Что я пропускаю?

12
задан Mantas Vidutis 7 June 2010 в 02:31
поделиться

1 ответ

Подобная ошибка возникает, когда указанная вами сигнатура типа не соответствует фактическому типу функции. Поскольку вы не показали код, вызывающий ошибку, я должен предположить, но я предполагаю, что вы изменили его на что-то вроде этого:

flatmap _ [] = []  
flatmap f (x:xs) = f x ++ flatmap f xs

Что, как оказалось, совершенно правильно. Однако, если вы забыли также изменить сигнатуру типа, произойдет следующее:

Средство проверки типов увидит, что вы используете ++ в результатах f x и flatmap f xs . Поскольку ++ работает с двумя списками одного типа, средство проверки типов теперь знает, что оба выражения должны оцениваться как списки одного типа.Теперь проверка типов также знает, что flatmap f xs вернет результат типа [a] , поэтому fx также должен иметь тип [a] . Однако в сигнатуре типа указано, что f имеет тип t -> a , поэтому f x должен иметь тип a . Это приводит средство проверки типов к выводу, что [a] = a , что является противоречием и приводит к появлению сообщения об ошибке, которое вы видите.

Если вы измените сигнатуру типа на flatmap :: (t -> [a]) -> [t] -> [a] (или удалите ее), это будет работать.

22
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: