Я пытаюсь написать реализацию flatMap. Но это несущественно, мне очень интересно понять сообщение об ошибке. Но для контекста до сих пор у меня есть:Как я прочитал эту ошибку отверстия
flatMap ::
(a -> List b)
-> List a
-> List b
flatMap f xs = foldRight undefined undefined _undefined
Это дает следующее сообщение об ошибке для типа отверстия:
Found hole ‘_undefined’ with type: List a0
Where: ‘a0’ is an ambiguous type variable
Relevant bindings include
xs :: List a (bound at src/Course/List.hs:266:11)
f :: a -> List b (bound at src/Course/List.hs:266:9)
flatMap :: (a -> List b) -> List a -> List b
(bound at src/Course/List.hs:266:1)
In the third argument of ‘foldRight’, namely ‘_undefined’
In the expression: foldRight undefined undefined _undefined
In an equation for ‘flatMap’:
flatMap f xs = foldRight undefined undefined _undefined
Я знаю правильный колышек для этого отверстия хз, но я не понимаю, почему Haskell компилятор дал ему тип, обозначенный List a0, и как это относится к типу, который я собираюсь использовать List a?
Я думаю, что это имеет какое-то отношение к тому, что целое может взять надмножество типа List или что-то еще? почему тогда он просто не назвал его List b вместо специально List a0.
Приветствия, Джим
Он имеет отношение к типу 'foldRight', в частности, что он ожидает список в качестве третьего аргумента. 'a0' - просто другое имя переменной, его также можно было бы назвать' b'. Супертипы и подтипы не находятся в системе типа Haskell. – luqui
Cheers @luqui вот что мне интересно – JimmyP