Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
hardentoo
127 / 26 / 1
Регистрация: 10.10.2017
Сообщений: 32
1

Почему компилится?

03.04.2018, 06:39. Просмотров 356. Ответов 3

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

Haskell
1
2
3
4
5
6
7
8
9
10
{-# LANGUAGE MonomorphismRestriction #-}
 
module Main where
 
import Prelude hiding (id)
 
id :: a -> a
id x = x
 
main = print (id 2, id "string")
Сделал, ghc -XMonomorphismRestriction Main.hs -main-is Main -fforce-recomp -c -ddump-simpl

и посмотрел, что MonomorphismRestriction не применяется. Почему?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2018, 06:39
Ответы с готовыми решениями:

Почему не компилится
Почему не компилируется, вроде бы все правильно написал. вот сама таблица create table...

Behavior не компилится, не хватает конструктора. Объявляю, не компилится. Не пойму
В общем, такой вот код, но не компилируется. Что не так? Чёт не пойму вообще. /// <summary> ...

Почему программа компилится, хотя компилиться не должна?
#include <windows.h> #include <stdio.h> using namespace std; class foo { public: foo...

Почему код компилится и логика верна, а результаты арифм. операций нет?
задача состоит в создании двух массивов склавиатуры и суммы их елементов вместе и...

Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу?
То есть вообще непонятно ничё, вот, смотрите, этот пример не компилится: #include <stdio.h> class...

3
Catstail
Модератор
24916 / 12640 / 2312
Регистрация: 12.02.2012
Сообщений: 20,576
03.04.2018, 12:44 2
Мне кажется, потому, выбор id неудачен (нет ограничения типа) - a -> a Вот пример из книги:

Haskell
1
2
3
{-# LANGUAGE NoMonomorphismRestriction #-}
 
plus = (+)  // plus 5 3.5 вычислится нормально
Haskell
1
2
3
{-# LANGUAGE MonomorphismRestriction #-}
 
plus = (+)  // plus 5 3.5 породит ошибку
Haskell
1
2
3
4
{-# LANGUAGE MonomorphismRestriction #-}
 
plus :: Num a => a -> a -> a 
plus = (+)  // plus 5 3.5 нормально
1
Curry
2991 / 2072 / 257
Регистрация: 01.06.2013
Сообщений: 4,526
Записей в блоге: 9
03.04.2018, 18:39 3
Цитата Сообщение от hardentoo Посмотреть сообщение
вот код, который не должен компилиться
Чего бы ему не компилиться, если там два разных, независимых, вызова функции id ?
Не будет компилиться, например
Haskell
1
2
3
main = do
    let x = id 2
    print (x :: Int, x :: Integer)
но
Haskell
1
2
3
4
main = do
    let x :: Num a => a
        x = id 2
    print (x :: Int, x :: Integer)
будет
1
hardentoo
127 / 26 / 1
Регистрация: 10.10.2017
Сообщений: 32
03.04.2018, 22:18  [ТС] 4
Я думал, что не будет компилится, потому что когда вызовем id 2, то компилятор будет считать, что id :: Integer->Integer, и ему не понравится id "string", так как там уже id :: String -> String. Понял, что был не прав, так как все равно id :: a-> a, и у нас действительно 2 разных вызова функции, не смотря на MonomorphismRestriction, который делает несколько иное. Catstail, KolodeznyDiver, ваши примеры разобрал, спасибо.
0
03.04.2018, 22:18
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2018, 22:18

Есть объект типа T, но если вместо него подставить вызов функции, возвращающей T, код не компилится, почему?
Есть объект типа vector<int>, но если вместо него подставить вызов функции, возвращающей...

Не компилится(
Что за ошибка? Код likes('Иван’,’Марья’). likes('Петр’,’футбол’). likes('Иван',X) :-...

Не компилится!
Здравствуйте. Подскажите ошибки пожалуйста. Задание: Написать рекурсивную функцию, которая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.