169 похожих чатов

Вопрос по диагностике ошибок (я знаю в чем, в данном

конкретном примере, я знаю, как исправить,
пример модельный, понятно, что в реальности бывает намного запутаннее).

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 с параметром что угодно).

То есть, теоретически, я не понимаю, почему сообщение об ошибке именно такое (и читаю его как "ой, тут что-то не так, надо подумать"),
а практически - нет ли способа попросить компилятор вывести его цепочку рассуждений про уравнения на типы?

11 ответов

41 просмотр

Основная тут проблема в том, что type String = [Char], если использовать Text из text:Data.Text, сообщение об ошибке будет более вменяемым

Глафира-Слоникова Автор вопроса
TOV_MULTIMASSO
Основная тут проблема в том, что type String = [Ch...

А для Text надо какую функцию вывода использовать?

Глафира-Слоникова Автор вопроса

Сдампать весь процесс вывода типов — плохая идея, потому что 99% будет нерелевантно (как в g++, который дампает весь процесс подстановки шаблонов)

В начале файла {-# OPTIONS -ddump-tc-trace #-} Наслаждайся

TOV_MULTIMASSO
Пост-MonoLocalBinds?

Нет, я про монлморфизацию функций

Глафира-Слоникова Автор вопроса
TOV_MULTIMASSO
Сдампать весь процесс вывода типов — плохая идея, ...

Ну пока осмысленных фильтров внутри ghc нет, можно будет грепать по нужным тебе идентификаторам, вариантов-то нет (сейчас C++ вроде с концептами будет раньше останавливаться и меньше дампать)

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта