powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Простые вопросы по Haskell
25 сообщений из 32, страница 1 из 2
Простые вопросы по Haskell
    #36532778
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.haskell.org/haskellwiki/Type

Смотрю пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
module Main where

data Suit = Club | Diamond | Heart | Spade
     deriving (Read, Show, Enum, Eq, Ord)

data CardValue = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace
     deriving (Read, Show, Enum, Eq, Ord)

data Card = Card {value :: CardValue, suit :: Suit}
     deriving (Read, Show, Eq)

instance Ord Card where
         compare c1 c2 = compare (value c1, suit c1) (value c2, suit c2)

instance Enum Card where
         toEnum n  = let (v, s) = n `divMod`  4  in Card (toEnum v) (toEnum s)
         fromEnum c = fromEnum (value c) *  4  + fromEnum (suit c)

type Deck = [Card]

deck :: Deck
deck = [Card val su | val <- [Two .. Ace], su <- [Club .. Spade]]


main = print deck

Возник вопрос: почему нельзя написать
Код: plaintext
1.
data Card value suit = Card (CardValue value) (Suit suit)
     deriving (Read, Show, Eq)
и что вообще значит запись в фигурных скобках и для чего предназначены переменные после названия типа (type variables после type name)?

Помимо примера также непонятно, в чем разница между конструктором типа и данных (type constructor и data constructor)?

Посоветуйте, где почитать про основной синтаксис Haskellа: то что fromEnum - это из Prelude я понял, а вот откуда узнать, что значит запись
Код: plaintext
let (v, s) = ... in Card (toEnum v) (toEnum s)
или
Код: plaintext
deck :: Deck // инициализация переменной типа Deck?
? Есть какой-нибудь ман?

Заранее спасибо за ответы!
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36532809
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты и эстремист! Ктож так язык изучает?
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36532815
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

да вот проблема. :)

C, C#, PHP, да хоть Java - все маны начинаются с Language Reference и потом уже с Function Reference.

У Haskellа как такового Language Reference не нашел. :( Будут благодарен за ссылку!
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36532847
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой документ. Называется The Haskel 98 Report . В нем есть кое-что по языку. Но изложено очень сухим языком. Лично для меня это было не очень подходящее подручное чтиво.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36532852
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

а мне нравится! Спасибо вам. Длинный правда, придется читать по диагонали, так как осваиваю пока что для экспериментов и времени досконально вычитывать 277 страниц нет. :(
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36532931
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Haskell классный. :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
module Main where

data Bogus = Bogus {valueBogus :: Char}

class BogusSuper b where
      bogusSuper :: b -> [Char]

class BogusSuper b => BogusChild b where
      bogusChild :: b -> [Char]

instance BogusChild Bogus where
         bogusChild a = [valueBogus a, valueBogus a, valueBogus a]

instance BogusSuper Bogus where
         bogusSuper a = [valueBogus a]

test = Bogus 'b'

main = do print (bogusSuper test)
          print (bogusChild test)
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533054
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что компилятору не нравится?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
module Main where


factorial  0  =  1 
factorial n = n * factorial (n -  1 )

 
calc s b lm ln cl c t = let s        = c * b * t
                            ks  1   1    = s
                            ks  1  ln  = ks  1  (ln -  1 ) + s ^ ln
                            ks lm ln = ks  1  ln - ks  1  lm
                            v c  1     = ks lm ln * ( 1  - exp (-c / ks lm ln))
                            v c cl   = ks lm ln * ( 1  - exp (-v c (cl -  1 ) / ks lm ln))
                            srt c  1   =  1 
                            srt c cl =  1  - srt c (cl -  1 ) * ( 1  - v c cl / ks lm ln)
                            sr       =  1  - ( 1  - srt c cl) ^ t
                        in [s, sr]

calc16 s lm ln cl c t = calc s  16  lm ln cl c t


r = calc16  3   1   3   3   3   3 


main = print r
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
>..\ghc --make test.hs
[ 1  of  1 ] Compiling Main             ( test.hs, test.o )

test.hs: 57 : 14 :
    Ambiguous type variable `t' in the constraints:
      `Integral t' arising from a use of `calc16' at test.hs:57:14-31
      `Floating t' arising from a use of `calc16' at test.hs: 57 : 14 - 31 
    Possible cause: the monomorphism restriction applied to the following:
      calc_result :: [t] (bound at test.hs: 57 : 0 )
    Probable fix: give these definition(s) an explicit type signature
                  or use -XNoMonomorphismRestriction
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533074
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,

судя по всему, не может вывести тип t - с одной стороны он вроде как Integer а сдругой Float - смотрите типы операций, откуда он это взял - наверное ln и exp хотят флоат а передают int
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533079
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
belugin,

то что не может тип вывести я понял.

Как ни странно, проблема скорее всего в строке
Код: plaintext
sr       =  1  - ( 1  - srt c cl) ^ t
, так как вот так работает
Код: plaintext
1.
2.
                            srt c cl =  1  - srt c (cl -  1 ) * ( 1  - v c cl / ks lm ln)
                            -- sr       = 1 - (1 - srt c cl) ^ t
                        in [s, srt c cl]
.

Т. е. по всей видимости ^ не определена для тех типов, какими выводятся (1 - srt c cl) и t, что для меня странно - ^ принимает Num и Integral - вроде достаточно общие типы.

Меня другое удивляет - компилятор не может поподробнее рассказать, что вообще случилось в какой строке и т. п.? Там стек-трейс выложить...

Непонятно, что с этим делать.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533106
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymМеня другое удивляет - компилятор не может поподробнее рассказать, что вообще случилось в какой строке и т. п.? Там стек-трейс выложить...

Хочешь есть мёд, да еще и большой ложкой? Учись писать без ошибок! Это, насколько я понимаю основная концепция ФП. Пишешь мало. Получаешь много.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533119
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

дык ошибок-то нет! Компилятор не может вывести типы, а это уже его проблема. Если бы он мне сообщил, где конкретно ошибка (его сообщение эквивалентно: "у тебя где-то ошибка", потому что указывает на вызов функции в самом высоком скоупе), я бы ему помог.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533127
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymКомпилятор не может вывести типы, а это уже его проблема.
Вкушаешь все прелести ФП...

Переведи это описание фикса на русский и попробуй применить. А уже потом кричи что тебе дескать компиллятор ничено не сказал.

Код: plaintext
1.
Probable fix: give these definition(s) an explicit type signature
                  or use -XNoMonomorphismRestriction
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533128
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

да я всё перевел. Я понимаю, что случилось. Я не понимаю где (и почему), в какой строке какой операнд не того типа, потому что компилятор указывает на самый верх стэка вызовов, а ошибка явно в самом низу.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533130
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всмысле наоборот - указывает на самый низ, а ошибка явно наверху.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533134
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nymВсмысле наоборот - указывает на самый низ, а ошибка явно наверху.
Знаешь, когда у меня нихрена не получается и я нихрена не понимаю - я беру и просто УПРОЩАЮ исходник до тривиального случая. Это что-то вроде "дихотомического поиска ошибок".

Советую и тебе так-же поступить. А понимание толкования ошибок придёт только с опытом.

Упрости функцию calc и всё заработает.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533138
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще в hugs есть инструкции типа :t - посмотреть какого типа символ - можно попробовать для составляющих функций посмотреть, что оно там понавыводило

посмотри, как обычно взаимодействуют в стиле REPL

Интересно, есть ли среда, чтоб как в F# - просто наводишь курсор и видишь тип
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533143
belugin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beluginеще в hugs

и в ghci
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533429
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an0nym,
возведение в степень с плавающей точкой - **
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36533439
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,
Код: plaintext
1.
ks lm ln * ( 1  - exp (-c / ks lm ln))
здесь видно что 2-й аргумент ф-и ks - вещественное число
а вот мы подставляем 2-м аргументом ln
Код: plaintext
1.
ks  1  ln  = ks  1  (ln -  1 ) + s ^ ln

и в то же время ф-я (^) принимает значения целого типа

или замени (^) на (**). или делай приведение типов с помощью fromIntegral
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36534181
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN,

спасибо! Теперь стало понятнее.
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36534201
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNа вот мы подставляем 2-м аргументом ln
Код: plaintext
1.
ks  1  ln  = ks  1  (ln -  1 ) + s ^ ln

и в то же время ф-я (^) принимает значения целого типа
Почему здесь ln :: Integral я понял - потому что (^) :: (Num a, Integral b) => a -> b -> a.
ZyK_BotaN
Код: plaintext
1.
ks lm ln * ( 1  - exp (-c / ks lm ln))
здесь видно что 2-й аргумент ф-и ks - вещественное число
А вот почему здесь ln вещественное число?
Код: plaintext
(ks lm ln) * ( 1  - exp (-c / (ks lm ln)))
Почему оно здесь не выводится как Integral?
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36534219
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ведь
Код: plaintext
1.
2.
3.
                            ks  1   1    = s
                            ks  1  ln  = ks  1  (ln -  1 ) + s ^ ln
                            ks lm ln = ks  1  ln - ks  1  lm
Код: plaintext
1.
2.
3.
(^) :: (Num a, Integral b) => a -> b -> a
(^) s ln -- ln :: Integral
(-) :: a -> a -> a
(-) ln  1  -- почему нельзя вывести как Integral, если в других местах накладывается такое ограничение?
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36534293
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
ks lm ln * ( 1  - exp (-c / ks lm ln))
здесь видно что 2-й аргумент ф-и ks - вещественное число -- из-за экспоненты
а вот мы подставляем 2-м аргументом ln
Код: plaintext
1.
ks  1  ln  = ks  1  (ln -  1 ) + s ^ ln 
-- на месте 2-го аргумента ln(целого типа), можно записать
(fromIntegral ln), для приведения целого к вещественному
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36534325
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN
Код: plaintext
1.
ks lm ln * ( 1  - exp (-c / ks lm ln))
здесь видно что 2-й аргумент ф-и ks - вещественное число -- из-за экспоненты
а вот мы подставляем 2-м аргументом ln
Код: plaintext
1.
ks  1  ln  = ks  1  (ln -  1 ) + s ^ ln 
-- на месте 2-го аргумента ln(целого типа), можно записать
(fromIntegral ln), для приведения целого к вещественному

туплю, неправильно определил приоритет операций

но тогда ks должна возвращать число вещественного типа
можно записать:


Код: plaintext
(fromIntegral (ks lm ln)) * ( 1  - exp (-(fromIntegral c) / (fromIntegral (ks lm ln)))
может где-то ошибся, но суть думаю понятна. целые числа не могут участвовать в выражениях
с вещественными
...
Рейтинг: 0 / 0
Простые вопросы по Haskell
    #36534326
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN
Код: plaintext
1.
ks lm ln * ( 1  - exp (-c / ks lm ln))


Код: plaintext
1.
2.
3.
                          c
                   (- ---------)
                       f(x, y)
f(x, y) * ( 1  - e ^               )
Не понимаю, почему здесь y обязано быть вещественным?
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Простые вопросы по Haskell
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]