конкретном примере, я знаю, как исправить,
пример модельный, понятно, что в реальности бывает намного запутаннее).
module Main where
import Data.FixedList (FixedList, Cons ((:.)), Nil (Nil), fromFoldable', FixedList3)
import Data.Foldable (Foldable(toList))
import qualified Data.List (sort)
sort :: (Ord a, FixedList l) => l a -> l a
sort xs = fromFoldable' $ Data.List.sort $ toList xs
main :: IO ()
main = do
let a :: FixedList3 Int = 4 :. 3 :. 2 :. Nil
putStrLn $ sort a
сообщение об ошибке:
app/Main.hs:13:19: error: [GHC-83865]
• Couldn't match type ‘Int’ with ‘Char’
Expected: [Char]
Actual: FixedList3 Int
• In the first argument of ‘sort’, namely ‘a’
In the second argument of ‘($)’, namely ‘sort a’
In a stmt of a 'do' block: putStrLn $ sort a
|
13 | putStrLn $ sort a
Ошибка возникла, потому что я перепутал putStrLn и print.
putStrLn хочет строку, поэтому type checker понимает, что sort a должен вернуть строку, а он возвращает FixedList3
(type checker выводит это из другого уравнения на типы, в sort подается FixedList3, sort возвращает тот же тип, что и принимает).
При этом в сообщении об ошибке написано (как я его читаю, возможно, неправильно), In the first argument of ‘sort’, namely ‘a’ -
как будто если бы в этот sort (мой, а не Data.List! - компилятор это знает) надо подать [Char], и это ошибку типизации исправит
(на самом деле нет, [Char] подать в sort нельзя, [Char] не принадлежит классу FixedList с параметром что угодно).
То есть, теоретически, я не понимаю, почему сообщение об ошибке именно такое (и читаю его как "ой, тут что-то не так, надо подумать"),
а практически - нет ли способа попросить компилятор вывести его цепочку рассуждений про уравнения на типы?
Основная тут проблема в том, что type String = [Char], если использовать Text из text:Data.Text, сообщение об ошибке будет более вменяемым
А для Text надо какую функцию вывода использовать?
print $ show txt?
Text.IO.putStrLn
А, спасибо
Сдампать весь процесс вывода типов — плохая идея, потому что 99% будет нерелевантно (как в g++, который дампает весь процесс подстановки шаблонов)
В начале файла {-# OPTIONS -ddump-tc-trace #-} Наслаждайся
Постмоно ошибки иначе не дебагаются
Пост-MonoLocalBinds?
Нет, я про монлморфизацию функций
Ну пока осмысленных фильтров внутри ghc нет, можно будет грепать по нужным тебе идентификаторам, вариантов-то нет (сейчас C++ вроде с концептами будет раньше останавливаться и меньше дампать)
Обсуждают сегодня