Баг в GHCi?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 28.05.09 17:57
Оценка:
let f x = let g y = [x,y] in (g 1, g []) in 1


Выдает 1, а по-моему должна быть ошибка. Я прав?
Re: Баг в GHCi?
От: Буравчик Россия  
Дата: 28.05.09 18:10
Оценка:
Здравствуйте, nikov, Вы писали:

N>
N>let f x = let g y = [x,y] in (g 1, g []) in 1
N>


N>Выдает 1, а по-моему должна быть ошибка. Я прав?


Нет. Какая должна быть ошибка?

Prelude> let f x = let g y = [x,y] in (g 1, g [])
Prelude> :t f
f :: (Num [a]) => [a] -> ([a]], [a]])

... << RSDN@Home 1.2.0 alpha 4 rev. 1227>>
Best regards, Буравчик
Re[2]: Баг в GHCi?
От: deniok Россия  
Дата: 28.05.09 20:46
Оценка:
Здравствуйте, Буравчик, Вы писали:


Б>Нет. Какая должна быть ошибка?


Б>

Б>Prelude> let f x = let g y = [x,y] in (g 1, g [])
Б>Prelude> :t f
Б>f :: (Num [a]) => [a] -> ([a]], [a]])


написание instance Num [a] остается читателю в качестве упражнения
Re[3]: Баг в GHCi?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 29.05.09 04:29
Оценка:
Здравствуйте, deniok, Вы писали:

D>написание instance Num [a] остается читателю в качестве упражнения


А почему Hugs выдает ошибку? В какой момент должна возникать ошибка, если нет нужного инстанса — при компиляции определения функции или при компиляции ее вызова?

И почему такой код вызывает ошибку?

let f x = let g y = [x,y] in (g 1, g "")
Re[4]: Баг в GHCi?
От: Code Digger Грузия  
Дата: 29.05.09 06:16
Оценка:
Здравствуйте, nikov, Вы писали:

N>А почему Hugs выдает ошибку? В какой момент должна возникать ошибка, если нет нужного инстанса — при компиляции определения функции или при компиляции ее вызова?


N>И почему такой код вызывает ошибку?


N>
N>let f x = let g y = [x,y] in (g 1, g "")
N>


Видите ли, тут всё дело в выводе типов. Как Вы догадались, в одном списке не могут присутствовать значения разных типов. Однако, [] — полиморфный конструктор списка. Так получается, что в Вашем примере именно этот конструктор "подстраивается" под второй вызов с числовым аргументом. А пустая строка — конкретно список символов. В этом и разница.

Ошибка возникает в том месте, где type-checker не может вывести тип выражения.
Re[4]: Баг в GHCi?
От: deniok Россия  
Дата: 29.05.09 06:46
Оценка:
Здравствуйте, nikov, Вы писали:

N>И почему такой код вызывает ошибку?


N>
N>let f x = let g y = [x,y] in (g 1, g "")
N>



Здесь нет контекста, поскольку нет полиморфизма. Поэтому ищется instance Num [Char] (и не находится). А Num [a] — вполне валидный контекст (здесь есть переменная типа), хотя, конечно, каждый понимает, что "разумный" instance для него не написать. Если включить -XOverloadedStrings (с полиморфными строками), то опять появится полиморфизм и типизация опять будет допустима, в контексте (Num [a], IsString a) => ...
Re[5]: Баг в GHCi?
От: Буравчик Россия  
Дата: 29.05.09 07:02
Оценка:
Здравствуйте, deniok, Вы писали:

D>каждый понимает, что "разумный" instance для него не написать.


Вполне разумный будет для чего нибудь такого:

abs $ "123" * "2" + "-428"
... << RSDN@Home 1.2.0 alpha 4 rev. 1218>>
Best regards, Буравчик
Re[4]: Баг в GHCi?
От: palm mute  
Дата: 29.05.09 11:11
Оценка:
Здравствуйте, nikov, Вы писали:


N>И почему такой код вызывает ошибку?


N>
N>let f x = let g y = [x,y] in (g 1, g "")
N>


Этот код можно слегка поправить, чтобы проверка типов проходила успешно.
{-# LANGUAGE RankNTypes #-}
f :: (forall a . a) -> ([Int], [String])
f x = let g y = [x,y] in (g 1, g "")


Типы высших рангов не выводятся.
Re[5]: Баг в GHCi?
От: Code Digger Грузия  
Дата: 31.05.09 08:41
Оценка:
Здравствуйте, palm mute, Вы писали:

PM>Здравствуйте, nikov, Вы писали:



N>>И почему такой код вызывает ошибку?


N>>
N>>let f x = let g y = [x,y] in (g 1, g "")
N>>


PM>Этот код можно слегка поправить, чтобы проверка типов проходила успешно.

PM>
PM>{-# LANGUAGE RankNTypes #-}
PM>f :: (forall a . a) -> ([Int], [String])
PM>f x = let g y = [x,y] in (g 1, g "")
PM>


PM>Типы высших рангов не выводятся.


И как такой код будет выполняться??? Для каких аргументов f он имеет корректную типизацию?
Re[6]: Баг в GHCi?
От: VoidEx  
Дата: 31.05.09 10:17
Оценка:
Здравствуйте, Code Digger, Вы писали:

CD>И как такой код будет выполняться??? Для каких аргументов f он имеет корректную типизацию?


Очевидно для тех, которые имеют одновременно любой тип. Ну, например, error
Больше в голову ничего не приходит кроме bottom'а.

Но если сделать так:
f : (forall a . [a]) -> ([Int], [String])
f x = let g y = y:x in (g 1, g "")

То значение, которое имеет тип любого списка у нас уже есть
ghci> f []
([1],[""])
Re[6]: Баг в GHCi?
От: palm mute  
Дата: 31.05.09 10:23
Оценка:
Здравствуйте, Code Digger, Вы писали:

CD>И как такой код будет выполняться??? Для каких аргументов f он имеет корректную типизацию?

Именно эту функцию можно вызвать только с x=_|_ . Если ограничить переменную типов 'a' каким-то контекстом, можно будет передавать отличные от задницы полиморфные аргументы
{-# LANGUAGE RankNTypes #-}
class Foo a where 
    quux :: a
    bzzt :: a
instance Foo String where
    quux = "quux"
    bzzt = "bzzt"
instance Foo Int where
    quux = 42
    bzzt = 1

f :: (forall a . (Foo a) => a) -> ([Int], [String])
f x = let g y = [x,y] in (g 1, g "")

main = 
    do print (f quux)
       print (f bzzt)
Re[3]: Баг в GHCi?
От: nikov США http://www.linkedin.com/in/nikov
Дата: 01.06.09 12:28
Оценка:
Здравствуйте, deniok, Вы писали:


Б>>

Б>>Prelude> let f x = let g y = [x,y] in (g 1, g [])
Б>>Prelude> :t f
Б>>f :: (Num [a]) => [a] -> ([a]], [a]])


D>написание instance Num [a] остается читателю в качестве упражнения :))


Кстати, согласно haskell report, 4.1.3 и 4.5.3, (Num [a]) — это невалидный контекст, т.к. [] — это не type variable.
Re[4]: Баг в GHCi?
От: awson  
Дата: 01.06.09 13:34
Оценка:
Здравствуйте, nikov, Вы писали:
N>Кстати, согласно haskell report, 4.1.3 и 4.5.3, (Num [a]) — это невалидный контекст, т.к. [] — это не type variable.

В Haskell 98 MPTC вообще нет, о чем тут говорить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.