powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell: вопросы
25 сообщений из 123, страница 2 из 5
Haskell: вопросы
    #39643868
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonВ сях было компактнее.
ну последнюю строчку можно было то и так написать:
Код: sql
1.
norm v = prod v $ 1.0 / sqrt $ sprod v v   ;


Окей. Два вопроса. Ну.. мне привычнее приоритеты со скобками. Тоесть я-бы сделал 2 steps
назад и всё-таки записал так.
Код: sql
1.
norm v = prod v ( 1.0 / sqrt ( sprod v v ) ) ;


Это норм с точки зрения Haskell? Ну тоесть я надеюсь что я ничего страшного не потерял от
такого преобразования.

И второй вопрос. Конструктор типа. Каким образом я могу нормализовать вектор (3.0, 4.0, 5.0) ?
Я декларировал функцию norm как
Код: sql
1.
norm :: Vector -> Vector



и чтоб подстановка сработала я должен как-то сообщить о том что это не просто tuple а именно Вектор.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643869
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmayton
Код: plaintext
1.
(r)


зачем в скобки взял аргумент?
Ну ХЗ. Взял и взял. Вроде ничего не нарушил. Просто (сорян) пока еще не привых к списочному
описанию аргументов.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643870
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу.. мне привычнее приоритеты со скобками.



maytonЭто норм с точки зрения Haskell?

это не лисп. тут не одобряют, но терпимо вполне.


maytonи чтоб подстановка сработала я должен как-то сообщить о том что это не просто tuple а именно Вектор.
не должен. тут Vector - синоним туплу из 3-х дублов.

если хочешь отдельный тип, то сделай либо newtype либо data.

когда альтернативных контрукторов нет, то лучше newtype юзать
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643871
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNне должен. тут Vector - синоним туплу из 3-х дублов.

если хочешь отдельный тип, то сделай либо newtype либо data.

когда альтернативных контрукторов нет, то лучше newtype юзать
А по перформансу есть какие-то рекомендации?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643872
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaNне должен. тут Vector - синоним туплу из 3-х дублов.

если хочешь отдельный тип, то сделай либо newtype либо data.

когда альтернативных контрукторов нет, то лучше newtype юзать
А по перформансу есть какие-то рекомендации?
разницы не должно быть.
но если хочешь, что-бы туплы с векторами тайпчекером различались, то вот так пиши:
Код: sql
1.
2.
3.
4.
newtype Vector = Vector (Double, Double, Double)

summation :: Vector -> Vector -> Vector
summation (Vector (x1, y1, z1)) (Vector (x2, y2, z2)) = Vector(x1 + x2, y1 + y2, z1 + z2)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643876
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN, окей пускай будет старый вариант без явного указания векторов. Потом
сравню когда будет весь код написан.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643878
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПотом
сравню когда будет весь код написан.
в скорости - разницы не будет. это для тайпчекера.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643880
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА по перформансу есть какие-то рекомендации?
по перфоменсу начнется жара, когда сами вычисления начнешь писать. хаскель тут подготовит сюрпризы (:
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643884
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нутывидел. Восновном операции с алгеброй векторов. Там есть конечно и другие действия
например проверки условий и передача параметров в рекурсию и очистка хипа
(здесь была просадка у Java) но основное туловище ботлнека лежит только на
вычислениях Double.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643886
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНутывидел. Восновном операции с алгеброй векторов. Там есть конечно и другие действия
например проверки условий и передача параметров в рекурсию и очистка хипа
(здесь была просадка у Java) но основное туловище ботлнека лежит только на
вычислениях Double.
хаскель предоставляет сюрпризы для новичка, в плане реализации "циклов"
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643888
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonНутывидел. Восновном операции с алгеброй векторов. Там есть конечно и другие действия
например проверки условий и передача параметров в рекурсию и очистка хипа
(здесь была просадка у Java) но основное туловище ботлнека лежит только на
вычислениях Double.
хаскель предоставляет сюрпризы для новичка, в плане реализации "циклов"
Да я уже очькую. Но я надеюсь обход декартовых координат представляет собой
решаемую задачу. Цыкл там или Степановские хвостовые или безхвостые рекурсии.

Да... я начал собирать весь исходник. Пока нелетает.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
import Text.Printf

width = 512 
    
height = 512
    
g = [0x0003C712,
     0x00044814,
     0x00044818,
     0x0003CF94,
     0x00004892,
     0x00004891,
     0x00038710,
     0x00000010,
     0x00000010]

type Vector = (Double, Double, Double)

sum :: Vector -> Vector -> Vector
sum (x1, y1, z1) (x2, y2, z2) = (x1 + x2, y1 + y2, z1 + z2)

prod :: Vector -> Double -> Vector
prod (x, y, z) (r) = (r * x, r * y, r * z)

sprod :: Vector -> Vector -> Double
sprod (x1, y1, z1) (x2, y2, z2) = x1 * x2 + y1 * y2 + z1 * z2

norm :: Vector -> Vector
norm (x, y, z) = prod (x, y, z) ( 1.0 / sqrt( sprod( (x, y, z) (x, y, z) ) ) );


Курю. Ни пса непонять.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
card.hs:38:54: error:
    * Couldn't match expected type `(Double, Double, Double) -> Vector'
                  with actual type `(Double, Double, Double)'
    * The function `(x, y, z)' is applied to one argument,
      but its type `(Double, Double, Double)' has none
      In the first argument of `sprod', namely `((x, y, z) (x, y, z))'
      In the first argument of `sqrt', namely
        `(sprod ((x, y, z) (x, y, z)))'
   |
38 | norm (x, y, z) = prod (x, y, z) ( 1.0 / sqrt( sprod( (x, y, z) (x, y, z) ) ) );
   |                                                      ^^^^^^^^^^^^^^^^^^^
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643889
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЦыкл там или Степановские хвостовые или безхвостые рекурсии.
по умолчанию, в хасклеле не нужно писать хвостовых, ведь он ленивый.
но есть поределенные случаи, когда лень только во вред, тогда пишется явно "энергичная" фунция. её уже можно и хвостовой.

для на начала, попробуем обычной, а дальше профайлером померяем.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643890
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКурю. Ни пса непонять.
нельзя скобочки после sprod писать, получается что у тебя один аргумент, а не два
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643891
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonКурю. Ни пса непонять.
нельзя скобочки после sprod писать, получается что у тебя один аргумент, а не два
замени на
Код: sql
1.
norm (x, y, z) = prod (x, y, z) ( 1.0 / (sqrt (sprod (x, y, z) (x, y, z) ) ) )


з.ы. а почему ты не отказался от матчинга на состовляющие вектора, если ты их явно не юзаешь.
почему не?
Код: sql
1.
norm v = prod v ( 1.0 / (sqrt (sprod v v ) ) )
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643892
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonКурю. Ни пса непонять.
нельзя скобочки после sprod писать, получается что у тебя один аргумент, а не два
т.е. в хаскеле вызов функции записывается не:
Код: sql
1.
f(x y)


а:
Код: sql
1.
(f x y)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643894
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNз.ы. а почему ты не отказался от матчинга на состовляющие вектора, если ты их явно не юзаешь.
почему не?
Сорян. Тупанул. Пофиксил. GHCI сказал ОК.

Чуть позже будет вопрос по printf, IO.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643914
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I/O, мне пора что-то принтить на stdout.

Чувствую что я щас залезу в какие-то дебри. Порядок вывода там. Отсутствие side-effect e.t.c. Но мне нужен
этот механизм в каком-то виде чтоб решить задачу.

Код: sql
1.
2.
3.
4.
5.
import System.IO
import Text.Printf

--putStr ( "Hello" )
putStrLn ( "Hello "++width)



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Prelude> :l card.hs
[1 of 1] Compiling Main             ( card.hs, interpreted )

card.hs:42:1: error:
    Parse error: module header, import declaration
    or top-level declaration expected.
   |
42 | putStrLn ( "Hello "++width)
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643919
WebSharper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonI/O, мне пора что-то принтить на stdout.

https://www.haskell.org/tutorial/io.html

main :: IO ()
main = do c <- getChar
putChar c

The use of the name main is important
: main is defined to be the entry point of a Haskell program (similar to the main function in C), and must have an IO type, usually IO (). (The name main is special only in the module Main; we will have more to say about modules later.) This program performs two actions in sequence: first it reads in a character, binding the result to the variable c, and then prints the character. Unlike a let expression where variables are scoped over all definitions, the variables defined by <- are only in scope in the following statements.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643920
WebSharper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще на хабре про монады было: https://habr.com/post/315022/
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643927
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WebSharper The use of the name main is important :
так ты разобрался, что нужно в мейне "выполнять" функции с побочкой?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643928
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: sql
1.
2.
import System.IO
import Text.Printf


зачем тебе этот импорт? какие оттуда функции используешь?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643943
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmayton
Код: sql
1.
2.
import System.IO
import Text.Printf


зачем тебе этот импорт? какие оттуда функции используешь?
Это случайный шум который остался от проб. Пробовал putStr, printf.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643951
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WebSharpermaytonI/O, мне пора что-то принтить на stdout.

https://www.haskell.org/tutorial/io.html

main :: IO ()
main = do c <- getChar
putChar c

The use of the name main is important
: main is defined to be the entry point of a Haskell program (similar to the main function in C), and must have an IO type, usually IO (). (The name main is special only in the module Main; we will have more to say about modules later.) This program performs two actions in sequence: first it reads in a character, binding the result to the variable c, and then prints the character. Unlike a let expression where variables are scoped over all definitions, the variables defined by <- are only in scope in the following statements.
А можно как-то поскипать эти монадические теории? Мне ведь просто нужно упорядочить
несколько вызовов функций.

По сути я говорю - Окей. Вы подогнали под работу с STDOUT сложную теорию только для того
чтобы не сломались все предыдущие теории. Но я - как тот король в десткой песенке
просил "Только масла на завтрак мне подать".

Да простите мне мою нетерпеливость но что здесь не так и почему output не сработал?
Код: sql
1.
2.
3.
4.
main = do
 putStr "Enter you name : "
 name <- getLine
 putStr ( "Hello " ++ name ) 
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643952
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА можно как-то поскипать эти монадические теории? Мне ведь просто нужно упорядочить
несколько вызовов функций.
ну так пока тебе и не надо знать сих теорий.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643953
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВы подогнали под работу с STDOUT сложную теорию только для того
чтобы не сломались все предыдущие теории
не совсем правда. монады в хаскеле и для других целей. да и без монад был стдаут.
...
Рейтинг: 0 / 0
25 сообщений из 123, страница 2 из 5
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell: вопросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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