Это действительно странно. Это может быть ошибка.
Изменение исходного кода следующим образом
where
f x = T.pack (V.toList x)
(f -> t_pre, f -> t_post) = V.splitAt i v
заставляет GHC запрашивать FlexibleContexts
. После этого мы получаем очень странную ошибку:
Variable not in scope: f :: UV.Vector Char -> t
|
12 | (f -> t_pre, f -> t_post) = V.splitAt i v
| ^
Variable not in scope: f :: UV.Vector Char -> t1
|
12 | (f -> t_pre, f -> t_post) = V.splitAt i v
| ^
Мне это кажется ошибкой. f
там должно быть в области видимости.
Перемещение f
в глобальную область:
...
where
(f -> t_pre, f -> t_post) = V.splitAt i v
f x = T.pack (V.toList x)
Код теперь работает просто отлично. Это даже работает, если мы вернем глобальный f
к определению без точек.
Использование явной аннотации типа, как в
where
f :: UV.Vector Char -> Text
f x = T.pack (V.toList x)
(f -> t_pre, f -> t_post) = V.splitAt i v
выдает удивительное сообщение об ошибке
• Variable not in scope: f :: UV.Vector Char -> t
• Perhaps you meant ‘f’ (line 12)
Я не могу понять, что на самом деле происходит. В GHCi оба эти прекрасно работают
> let f = id ; foo (f -> x) = x in foo ()
()
> let bar = foo () where {f = id ; foo (f -> x) = x} in bar
()
Следовательно, мы можем использовать локальный f
в шаблонах представления. Тем не менее, когда типу f
требуется более осторожный вывод типа (?), Его нельзя использовать в шаблонах представления. Это похоже на ошибку. По крайней мере, сообщение об ошибке должно быть более четким.