БЕГЕМОТИКОВ МОЖНО! Войти !bnw Сегодня Клубы
На лоре тут продолжается лиспосрач. Интересная программка на хаскеле. Тут мы забыли написать ```x``` в конце. Бывает хули. ``` $ cat Test.hs module Test where strlen x = length ``` Модуль компилируется, все ок, потому что в хаскеле подефолту каррирование и тайпинференс. ``` $ ghc Test.hs [1 of 1] Compiling Test ( Test.hs, Test.o ) ``` Здесь обычное использование бажного strlen, который мы написали. ``` $ cat Main.hs import Test main = do putStrLn "Please enter a word" num <- getLine let size = strlen num putStrLn $ "The size of your string is: " ++ show size ++ "!" ``` Компилируем его и получаем клевые сообщения об ошибках! ``` $ ghc Main.hs [2 of 2] Compiling Main ( Main.hs, Main.o ) Main.hs:7:48: No instance for (Show ([a0] -> Int)) arising from a use of `show' Possible fix: add an instance declaration for (Show ([a0] -> Int)) In the first argument of `(++)', namely `show size' In the second argument of `(++)', namely `show size ++ "!"' In the second argument of `($)', namely `"The size of your string is: " ++ show size ++ "!"' ``` В чем тут проблема? В том, что тайпчекер не заставил нас написать аннотацию для top-level функции strlen, а вывел типы из определения функции, причем типы вывел не те, которые мы хотели. То есть, вместо того чтобы сказать программисту, чтобы он предоставил сигнатуру функции и сказал чего хочет, компилятор вывел типы и зафейлился уже в другом месте. В хаскеле есть флаг чтобы запретить декларирование top-level функций без сигнатурок? tldr: с type inference надо быть аккуратным.
#TCXQ01 / @ninesigns / 3688 дней назад

-Wall
#TCXQ01/H0I / @l29ah / 3688 дней назад
С anything inference надо быть аккуратным.
#TCXQ01/X9K / @ndtimofeev / 3688 дней назад

-fwarn-missing-signatures (и, опционально, -Werror, чтобы заставить фиксить)

#TCXQ01/YE0 / @minoru / 3688 дней назад
@l29ah ``` % ghc -v Glasgow Haskell Compiler, Version 7.4.1, stage 2 booted by GHC version 7.4.1 Using binary package database: /usr/lib/ghc/package.conf.d/package.cache Using binary package database: /home/dc/.ghc/x86_64-linux-7.4.1/package.conf.d/package.cache hiding package X11-1.5.0.1 to avoid conflict with later version X11-1.6.1.1 hiding package xmonad-0.10 to avoid conflict with later version xmonad-0.11 wired-in package ghc-prim mapped to ghc-prim-0.2.0.0-c2ff696e5b8ec4d4b2bc2e42085fe471 wired-in package integer-gmp mapped to integer-gmp-0.4.0.0-3cccac07aef8e27023f605c1f45bdf74 wired-in package base mapped to base-4.5.0.0-40b99d05fae6a4eea95ea69e6e0c9702 wired-in package rts mapped to builtin_rts wired-in package template-haskell mapped to template-haskell-2.7.0.0-8c8cd20e21666657195efabced685fe1 wired-in package dph-seq not found. wired-in package dph-par not found. Hsc static flags: -static *** Deleting temp files: Deleting: *** Deleting temp dirs: Deleting: ghc: no input files Usage: For basic information, try the `--help' option. dc@mfalcon /home/dc/dcode/haskell % cat tst.hs module Test where strlen x = length % ghc tst.hs -Wall % ```
#TCXQ01/VEN / @ninesigns --> #TCXQ01/H0I / 3688 дней назад
@4da Ты ебанат, удоли tst.хуйпизда.
#TCXQ01/G32 / @l29ah --> #TCXQ01/VEN / 3688 дней назад
@l29ah ебанаты это авторы ghc и ты с ними впридачу. если я вызываю gcc file.c, но скомпилит вне зависимости от file.хуйпизда
#TCXQ01/8DE / @ninesigns --> #TCXQ01/G32 / 3688 дней назад

@4da Потому что gcc глуповат, он даже в зависимости не умеет, в отличие от ghc --make, например. Хочешь принудительную рекомпиляцию — -fforce-recomp.

#TCXQ01/3H8 / @minoru --> #TCXQ01/8DE / 3688 дней назад
@minoru нет, gcc делает то, что должен - компилирует сишник в единицу трансляции.
#TCXQ01/FO9 / @ninesigns --> #TCXQ01/3H8 / 3688 дней назад
@minoru > -fforce-recomp там чо кухонный комбайн чтоли вместо компилятора? дибилы ппц
#TCXQ01/MVG / @ninesigns --> #TCXQ01/3H8 / 3688 дней назад
@4da Сказал 4da, который использует gcc вместо as и ld.
#TCXQ01/S0E / @l29ah --> #TCXQ01/MVG / 3688 дней назад
@l29ah cpp забыл ещё.
#TCXQ01/V9R / @l29ah --> #TCXQ01/S0E / 3688 дней назад
@l29ah в gcc есть поведение когда он не перекомпилит исходник в объектный файл?
#TCXQ01/FLZ / @ninesigns --> #TCXQ01/S0E / 3688 дней назад

потому что надо писать strlen = length, потому что не point-free не круто и на хаскелль-вей // и потом сидеть и думать, сколько же и какие вообще аргументы принимает это говно с кучей flip, . и $

#TCXQ01/B4G / @anonymous / 3688 дней назад
@anonymous // зато математично
#TCXQ01/KLG / @ninesigns --> #TCXQ01/B4G / 3688 дней назад
@4da `-fforce-recomp`
#TCXQ01/AWT / @kb --> #TCXQ01/VEN / 3688 дней назад
@4da А лучше сразу через cabal, тот понимает, когда изменился .cabal-файл и перекомпилирует тебе все сам
#TCXQ01/CYT / @kb --> #TCXQ01/VEN / 3688 дней назад
Я нихуя не понял. Тайпклассовые костыли подломились, что ли?
#TCXQ01/EV8 / @komar / 3687 дней назад
@komar Что? Почему? Обычная ошибка типов же: для `strlen` вывелся тип `b -> [a0] -> Int`, потом мы сделали `strlen num`, получилась функция с типом `[a0] -> Int`, которую мы передали в `show`. Т.к. инстанса `Show` для указанного типа не нашлось, тайпчекер программу не пропустил.
#TCXQ01/FAL / @minoru --> #TCXQ01/EV8 / 3686 дней назад
@komar Нет. Просто кто-то открыл для себя возможность вернуть функцию как результат.
#TCXQ01/46K / @ndtimofeev --> #TCXQ01/EV8 / 3686 дней назад
@ndtimofeev причем в результате опечатки
#TCXQ01/PLS / @ninesigns --> #TCXQ01/46K / 3686 дней назад
@ndtimofeev Тьфу.
#TCXQ01/XMV / @komar --> #TCXQ01/46K / 3686 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.