powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell: вопросы
123 сообщений из 123, показаны все 5 страниц
Haskell: вопросы
    #39643553
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топик возник в продолжение 21404620

Здесь я буду постить различные вопросы по этому ЯП.

Вобщем вопрос 1. Здесь я пытаюсь создать инфиксный оператор *+*.

Код: plaintext
1.
2.
3.
4.
Prelude> infixl 6 *+*

<interactive>:10:10: error:
    The fixity signature for `*+*' lacks an accompanying binding



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

Здесь я буду постить различные вопросы по этому ЯП.

Вобщем вопрос 1. Здесь я пытаюсь создать инфиксный оператор *+*.

Код: plaintext
1.
2.
3.
4.
Prelude> infixl 6 *+*

<interactive>:10:10: error:
    The fixity signature for `*+*' lacks an accompanying binding




Прокомментируйте ошибку и как фиксить.
егод для начала нужно создать, т.е. объявить.

пусть это будет обычной суммой, например(но можно и другую функцию присвоить сему знаку).

и делать это нужно не в интерпретаторе.
создай файлик, там пиши код, а потом загружай в ghci( https://downloads.haskell.org/~ghc/7.6.2/docs/html/users_guide/loading-source-files.html)

код по типу такого:
Код: sql
1.
2.
(*+*) = (+)
infixl 6 *+*
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643607
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создал файлик tut02.hs
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
infixl 6 *+*
a *+* b = a^2 + b^2

-- 3 *+* 4

-- 3 (*+*) 4

(*+*) 3 4


:load в интерпретаторе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Prelude> :l tut02.hs
[1 of 1] Compiling Main             ( tut02.hs, interpreted )

tut02.hs:8:1: error:
    Parse error: module header, import declaration
    or top-level declaration expected.
  |
8 | (*+*) 3 4
  | ^^^^^^^^^
Failed, no modules loaded.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643608
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал определить список констант. Что-то не так делаю. Пробелы и TAB-ы играют роль? Где? В каком месте?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
let width = 512 
    
    height = 512
    
    g = [ 
      0x0003C712,
      0x00044814,  
      0x00044818,  
      0x0003CF94,  
      0x00004892,  
      0x00004891,  
      0x00038710,
      0x00000010,
      0x00000010
    ]



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

card.hs:18:5: error:
    parse error (possibly incorrect indentation or mismatched brackets)
   |
18 |     ]
   |     ^
Failed, no modules loaded.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643611
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСоздал файлик tut02.hs
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
infixl 6 *+*
a *+* b = a^2 + b^2

-- 3 *+* 4

-- 3 (*+*) 4

(*+*) 3 4



:load в интерпретаторе
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Prelude> :l tut02.hs
[1 of 1] Compiling Main             ( tut02.hs, interpreted )

tut02.hs:8:1: error:
    Parse error: module header, import declaration
    or top-level declaration expected.
  |
8 | (*+*) 3 4
  | ^^^^^^^^^
Failed, no modules loaded.


так все правильно.

сие выражение:
Код: sql
1.
(*+*) 3 4


смысла не имеет, ибо не является определениями.

а хаскель сорц - только из определений состоит.\

вот если бы ты написал:
Код: sql
1.
x = (*+*) 3 4



или лучше:

Код: sql
1.
x = 3 (*+*)  4
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643612
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,


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

а уже в интерпретаторе можешь писать
Код: sql
1.
(*+*) 3 4


и получить ответ
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643613
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПробелы и TAB-ы играют роль? Где? В каком месте?
да. играют.
такого оператора как let в сорцах хаскеля нету(не интерпретатор), есть "let ... in ..", но это уже другая история.

нужно так определять:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
width = 512 
    
height = 512
    
g = [ 
      0x0003C712,
      0x00044814,  
      0x00044818,  
      0x0003CF94,  
      0x00004892,  
      0x00004891,  
      0x00038710,
      0x00000010,
      0x00000010
    ]
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643614
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNтакого оператора как let в сорцах хаскеля нету
венее он есть, но в рамках синтаксиса для монад.

работая в интерпретаторе, ты как-бы в монаде ио обитаешь, потому и юзаешь синтаксичейский сахар "let" для связывания значений. с рамках обычного кода, "let" не нужен.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643615
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNно в рамках синтаксиса для монад.
do-нотация:
https://en.wikibooks.org/wiki/Haskell/do_notation
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643622
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте перегрузку оператора поскипаем. Пока не нужно.

По поводу let. Вроде помогло. +Я включил в notepad++ подсветку TAB и пофиксил некоторые
проблемы. Вобщем Haskell чувствителен к невидимым символам.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643624
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВобщем Haskell чувствителен к невидимым символам.
да. как питон.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643626
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окей. Далее. Мне нужен примитив "вектор в 3х мерном пространстве". Вобщем нужно декларировать нечто
вроде
Код: plaintext
1.
2.
3.
struct Vector {
	double x, y, z;
}


и определить для него API для основных векторных операций. При этом мы подразумеваем что начало вектора
всегда лежит в точке (0,0,0).

Я так понимаю что это может быть Tuple. А может и Не-Тапл. Хрен знает. Но в данной постановке я конечно
буду предпочитать то решение которое более performance.

Надеюсь что статическая типизация и 100% вывод типом помогут Хаскелу убрать ненужные абстакции
в бинарном коде и собрать эффективный.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643627
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ так понимаю что это может быть Tuple. А может и Не-Тапл.
можно и через тупл.
а можно и через алгебраический тип данных
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643628
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNа можно и через алгебраический тип данных
что-то типа такого:
Код: sql
1.
2.
data Vector = Vector Int Int Int
   deriving (Show, Eq)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643629
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай через tuple пока.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643631
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавай через tuple пока.
ну тогда так:


Код: sql
1.
type Vector = (Int, Int, Int)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643633
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а функции писать так:
Код: sql
1.
2.
summation :: Vector -> Vector -> Vector
summation (x1, y1, z1) (x2, y2, z2) = (x1 + x2, y1 + y2, z1 + z2)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643636
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окей. Дай мне время до вечера. Тут не сложно закодить. Сорцы для портирования есть.
Сложно протестить например вещесвтенное умножение векторов. В Java/Junit был специальный
assert(...) с некоторой сигмой. Можно было проверять приближенные вычисления.

Код: plaintext
1.
type Vector = (Double, Double, Double)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643637
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТут не сложно закодить
в хацкеле тебя ждут подводные камни. на нем нужно писать не так как на лиспах всяких.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643638
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСложно протестить например вещесвтенное умножение векторов. В Java/Junit был специальный
assert(...) с некоторой сигмой. Можно было проверять приближенные вычисления.
ну написать функцию сравнения с сигмой не сложно ведь.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643639
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Думаю сделаю отдельное прил... модуль... сорс? Ладно короче пока до интеграции не дошел.
Просто приложение которое тестит само себя.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643640
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonСложно протестить например вещесвтенное умножение векторов. В Java/Junit был специальный
assert(...) с некоторой сигмой. Можно было проверять приближенные вычисления.
ну написать функцию сравнения с сигмой не сложно ведь.
что-то вроде:
Код: sql
1.
let eqs s a b = s > abs a - b
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643858
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задекларировал. Еще не тестил. Что-то нормализация вектора выглядит как-то хм.. многословно что-ли.
В сях было компактнее.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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) ) ) );
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643861
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ сях было компактнее.
ну последнюю строчку можно было то и так написать:
Код: sql
1.
norm v = prod v $ 1.0 / sqrt $ sprod v v   ;
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643862
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: plaintext
1.
(r)


зачем в скобки взял аргумент?
...
Рейтинг: 0 / 0
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
Haskell: вопросы
    #39643954
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonпочему output не сработал?
скопировал твой код. у меня всё работает.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643955
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonпочему output не сработал?
скопировал твой код. у меня всё работает.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643957
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonА можно как-то поскипать эти монадические теории? Мне ведь просто нужно упорядочить
несколько вызовов функций.
ну так пока тебе и не надо знать сих теорий.
Слава богу. Я думаю Жук что я докумекаю до них. Но я смотрю на Хаскелл с прищуром. Тоесть с вопросом
- "Что ты мне можешь дать" ? Мне нравится истинный полиморфизм. Я имею в виду способность функций
принимать (редуцировать) произвольный набор аргументов а также лениво их вычислять и вычислять бесконечные
последовательности.

Это прияно. Это новая степень свободы которая недоступна другим ЯП. Но конечно-же я не хочу
как Дон-Кихот воевать с мельницами. Я потрачу на I/O некоторое число человеко-часов. Дальше
я просто отложу его. Есть другие дела. Не менее интересные.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643958
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

загружая же исходник в ghci, main нужно явно запускать.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643959
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окей. А вы тоже в консоли сидите как я? Или есть среды?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643960
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ потрачу на I/O некоторое число человеко-часов.
там нет на что тратить время.
сами мондаы(не только ио) штука интересная.
вот здесь неплохо раскрыта:
https://rsdn.org/article/funcprog/monad.xml

но что-бы работать с вводом-воводом в хаскеле(на начальных этапах), теорию о монадах знать не обязательно.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643961
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОкей. А вы тоже в консоли сидите как я? Или есть среды?
может и есть. я в нотепад++ пишу. компилю с консоли.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643968
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скомпилил. Он как то странно себя ведет.

Код: sql
1.
2.
3.
C:\Users\mayton\Documents\Haskell>tut02.exe
eee
Enter you name : Hello eee


Сначала я получаю контекст ввода. А потом отрабатывает первая функция печати промпта. И третья с выводм приведа.

Чорт меня возьми! Чорт возьми этого Хаскела вместе с Чорчем!!
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643969
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСкомпилил. Он как то странно себя ведет.

Код: sql
1.
2.
3.
C:\Users\mayton\Documents\Haskell>tut02.exe
eee
Enter you name : Hello eee



Сначала я получаю контекст ввода. А потом отрабатывает первая функция печати промпта. И третья с выводм приведа.

Чорт меня возьми! Чорт возьми этого Хаскела вместе с Чорчем!!
Код: sql
1.
2.
3.
4.
main = do
 putStrLn "Enter you name : "
 name <- getLine
 putStr ( "Hello " ++ name ) 
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643970
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все точно так док.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643972
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВсе точно так док.
что так, ты разницу заметил?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643973
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
putStrLn? И как он влияет на порядок аргументов?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643975
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonputStrLn? И как он влияет на порядок аргументов?
тут не в аргументах, видимо, а в буфере вывода.
буфер по строкам, наверное, выводит.
путСтрЛн - даеёт окончание строки, вот ты и видишь в консоле вывод сразу.
а путСтр, только в фбуфер загоняет символы, и ты их видишь, только уже когда сам перевел строку в консоле.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39643976
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... ну теперь ввод работает в верном порядке. Но курсор прыгает не вовремя.
Код: sql
1.
2.
3.
Enter you name :
sss
Hello sss
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644013
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ссылки которые нашел. Пригодятся в топике. Пишу для себя.

Learning Haskell http://learn.hfm.io/

School of Haskell https://www.schoolofhaskell.com/

GHC User Guide https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/

Books https://wiki.haskell.org/Books

Очень специфический формат документации не позволяет мне пока искать API для себя.
Например. Как конвертить Double в String. Я догадываюсь что это должна быть функция
вида Double -> String. Но дайте мне чорт возьми классификатор или дорожную карту по API.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644014
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import System.IO
import Text.Printf

tostring :: Vector -> String
tostring (x, y, z) = 
 "(" ++ x ++ "," ++ y ++ "," ++ z ")"

v1 = (3.0, 4.0, 5.0)

main = do
  putStrLn ( "v1=" ++ (tostring v1) )



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
.....
card.hs:43:33: error:
    * Couldn't match expected type `[Char] -> [Char]'
                  with actual type `Double'
    * The function `z' is applied to one argument,
      but its type `Double' has none
      In the second argument of `(++)', namely `z ")"'
      In the second argument of `(++)', namely `"," ++ z ")"'
   |
43 |  "(" ++ x ++ "," ++ y ++ "," ++ z ")"
   |                                 ^^^^^
Failed, no modules loaded.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644017
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОчень специфический формат документации не позволяет мне пока искать API для себя.
Например. Как конвертить Double в String. Я догадываюсь что это должна быть функция
вида Double -> String. Но дайте мне чорт возьми классификатор или дорожную карту по API.
функция show
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644018
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonОчень специфический формат документации не позволяет мне пока искать API для себя.
Например. Как конвертить Double в String. Я догадываюсь что это должна быть функция
вида Double -> String. Но дайте мне чорт возьми классификатор или дорожную карту по API.
функция show
тип должен реализовывать typeclass Show(это что-то вроде интерфейса из ооп, с той лишь разницей, что связывание раннее, а не познее).
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644020
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import System.IO
import Text.Printf

tostring :: Vector -> String
tostring (x, y, z) = 
 "(" ++ x ++ "," ++ y ++ "," ++ z ")"

v1 = (3.0, 4.0, 5.0)

main = do
  putStrLn ( "v1=" ++ (tostring v1) )




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
.....
card.hs:43:33: error:
    * Couldn't match expected type `[Char] -> [Char]'
                  with actual type `Double'
    * The function `z' is applied to one argument,
      but its type `Double' has none
      In the second argument of `(++)', namely `z ")"'
      In the second argument of `(++)', namely `"," ++ z ")"'
   |
43 |  "(" ++ x ++ "," ++ y ++ "," ++ z ")"
   |                                 ^^^^^
Failed, no modules loaded.



можно было бы написать так:
Код: sql
1.
2.
3.
tostring :: Vector -> String
tostring (x, y, z) = 
 "(" ++ (show x) ++ "," ++ (show y) ++ "," ++ (show z) ++ ")"



но это не тру вей.
во первых, для вектора и так уже реализована функция show.
во вторых, если для твоего типа не реализована, ты должен указать что твой тип является инстансом класса Show и реализовать для него функцию show. кстати, для алгебраических типов, её можно реализовывать автоматически, вот я выше тебе приводил тип, для которого автоматически реализуются типы шоу и иквалс:

ZyK_BotaNZyK_BotaNа можно и через алгебраический тип данных
что-то типа такого:
Код: sql
1.
2.
data Vector = Vector Int Int Int
   deriving (Show, Eq)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644021
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNво первых, для вектора и так уже реализована функция show.
т.е. можно написать:
Код: sql
1.
2.
main = do
  putStrLn ( "v1=" ++ (show v1) )
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644023
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNно это не тру вей.
во первых, для вектора и так уже реализована функция show.
во вторых, если для твоего типа не реализована, ты должен указать что твой тип является инстансом класса Show и реализовать для него функцию show. кстати, для алгебраических типов, её можно реализовывать автоматически, вот я выше тебе приводил тип, для которого автоматически реализуются типы шоу и иквалс:

Как она реализована? Мне нужны круглые скобочки. Это будет важно для тестирования.

В стандартной документации я тону. Спасибо за show/eq. Если ты будешь кидать пруфы
где есть фирменная дока + пример использования - буду признателен. Многие вещи
непривычны. Я торможу не потому что не знаю как это сделать. А скорее слишком много
знания и слишком много вариантов как это сделать тормозят меня. А я в силу своего
перфекционизма не могу выбрать true way. Собсно для этого я и поднял топик.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644024
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забегу вперед.

Фрагмент С++-ной функции которая имеет очень непригодный для ФП вид. Ее надо портировать в Haskell.

Код: sql
1.
2.
3.
int tracer(Vector o, Vector d, double &t, Vector& n) {
   .....
}


Параметры t и вектор n - это out-параметры. Фактически их надо вернуть через return.

Есть мысль просто перенести их как результат функции кортеж.

Код: sql
1.
tracer :: Vector ->  Vector -> (Int, Double, Vector)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644025
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКак она реализована? Мне нужны круглые скобочки. Это будет важно для тестирования.
как обычная функция.
можно и со скобочками и без. в зависимости от контекста.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644026
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсть мысль просто перенести их как результат функции кортеж.
вполне логичное решение.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644038
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал определить новый тип с Show. Это треш какой-то. Как понять код ошибки?
Неужели я должен обойти over 9000 синтаксических форм чтоб выбрать одну единственно
правильную?

Код: sql
1.
newtype Vector = Double Double Double deriving (Show,Eq)


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

card.hs:27:18: error:
    * The constructor of a newtype must have exactly one field
        but `Double' has two
    * In the definition of data constructor `Double'
      In the newtype declaration for `Vector'
   |
27 | newtype Vector = Double Double Double deriving (Show,Eq)
   |                  ^^^^^^^^^^^^^^^^^^^^
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644043
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПопробовал определить новый тип с Show. Это треш какой-то. Как понять код ошибки?
Неужели я должен обойти over 9000 синтаксических форм чтоб выбрать одну единственно
правильную?

Код: sql
1.
newtype Vector = Double Double Double deriving (Show,Eq)



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

card.hs:27:18: error:
    * The constructor of a newtype must have exactly one field
        but `Double' has two
    * In the definition of data constructor `Double'
      In the newtype declaration for `Vector'
   |
27 | newtype Vector = Double Double Double deriving (Show,Eq)
   |                  ^^^^^^^^^^^^^^^^^^^^



тебя же вроде просто вектор устраивал. а там show уже реализован.
а так то, ты сам newtype неправильно записал. я же выше примел давал.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644044
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNа так то, ты сам newtype неправильно записал. я же выше примел давал.
Код: sql
1.
newtype Vector = Vector (Double, Double, Double)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644052
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... значит я пока в поиске.

Если сделать так

Код: sql
1.
newtype Vector = Vector (Double, Double, Double) deriving (Show, Eq)


то компилляция Вектора проходит норм. Но не собирается например функция скалярного произведения.
Код: sql
1.
2.
3.
4.
5.
6.
7.
    * Couldn't match expected type `Vector'
                  with actual type `(Double, Double, Double)'
    * In the pattern: (x2, y2, z2)
      In an equation for `sprod':
          sprod (x1, y1, z1) (x2, y2, z2) = x1 * x2 + y1 * y2 + z1 * z2
   |
36 | sprod (x1, y1, z1) (x2, y2, z2) = x1 * x2 + y1 * y2 + z1 * z2


Не знаю масштабов разрушения дальше...

Если я вернусь обратно к тапл-определению вектора то алгебра векторов компилится нормально.
Код: sql
1.
type Vector = (Double, Double, Double)


Но я снова буду определять tostring(..).
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644054
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНо я снова буду определять tostring(..).
зачем, если для кортешей уже реализована show?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644055
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonто компилляция Вектора проходит норм. Но не собирается например функция скалярного произведения.
логично.
ибо тогда так функция должна выглядеть, я выше писал:
21406334
ZyK_BotaNmaytonпропущено...

А по перформансу есть какие-то рекомендации?
разницы не должно быть.
но если хочешь, что-бы туплы с векторами тайпчекером различались, то вот так пиши:
Код: 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: вопросы
    #39644056
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNлогично.
ибо тогда так функция должна выглядеть, я выше писал:
т.е.
Код: sql
1.
sprod (Vector (x1, y1, z1)) (Vector (x2, y2, z2)) 
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644058
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... я предполагал что такой спул
Код: sql
1.
(2.0, 3.0, 4.0) (5.0,7.0,9.0) 


тестировать проще чем просто поток Double чисел. Да и вообще я
всегда так поступал с ::toString() или сериализацией. Я определял
свой формат сущности для удобства ее поиска в логе или текстовой
строке. В некоторых случаях это мог быть JSON. Но чаще всего
это просто идентификактор сущности и в скобках значение кортежа.

Поэтому мне важно было определить формат.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644059
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПоэтому мне важно было определить формат.
тебе не подходит стандартный show для кортежа?
ну тогда таки делай ньютайп и я тебя научу делать кастомные "имплементации" тайпклассов в хаскеле.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644060
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На сегодня я пас. Надо как-то это все переосмыслить.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644061
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа сегодня я пас. Надо как-то это все переосмыслить.
ты же в Киеве? можно будет и где-то в пивбаре встретиться.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644062
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будет евент. Java Day или Scala Day - тогда можно.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644063
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonScala Day
если ты скалу шаришь, то должен и в хаскеле многое понимать (:
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644670
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем чтоб я как буриданов ослик не стоял меж двух (трех) вариантов.
1) data Vector
2) type Vector (tuple)
3) newtype Vector

Можно резюмировать что есть что? По сути я ищу best practices для аналога struct из "C++".
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644671
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВобщем чтоб я как буриданов ослик не стоял меж двух (трех) вариантов.
1) data Vector
2) type Vector (tuple)
3) newtype Vector

Можно резюмировать что есть что? По сути я ищу best practices для аналога struct из "C++".
ты четвертое забыл - рекорды.
они и будут аналогом структур из с++, ибо емеют геттеры с именами полей.

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


з.ы. а я всегда data юзаю, не заморачиваясь.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644673
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорт с ним. Давай data.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644674
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧорт с ним. Давай data.
ну я уже их написал, вот так выглядят:
Код: sql
1.
2.
3.
4.
5.
6.
7.
data Vector = Vector { x :: Double
					 , y :: Double
					 , z :: Double
					 } deriving (Show, Eq)

sum' :: Vector -> Vector -> Vector
sum' v1 v2 = Vector ((x v1) + (x v2)) ((y v1) + (y v2)) ((z v1) + (z v2))
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644675
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonScala Day
если ты скалу шаришь, то должен и в хаскеле многое понимать (:
У меня нет энтерпрайзного опыта в Scala. Просто хобби.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644677
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaN, а зачем апостроф после sum' ?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644679
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДавай data.
вот:
Код: sql
1.
2.
3.
4.
data Vector = Vector Double Double Double deriving (Show, Eq)

sum' :: Vector -> Vector -> Vector
sum' (Vector x1 y1 z1) (Vector x2 y2 z2) = Vector (x1 + x2) (y1 + y2) (z1 + z2)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644680
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaN, а зачем апостроф после sum' ?
так как в модуле Prelude уже функция с таким именем есть.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644681
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonZyK_BotaN, а зачем апостроф после sum' ?
так как в модуле Prelude уже функция с таким именем есть.
а модуль сей, загружается в ghci по умолчанию и перекрывает нашу сумму.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644682
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaNпропущено...

если ты скалу шаришь, то должен и в хаскеле многое понимать (:
У меня нет энтерпрайзного опыта в Scala. Просто хобби.
ну что такое case class знаешь?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644683
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonZyK_BotaN, а зачем апостроф после sum' ?
так как в модуле Prelude уже функция с таким именем есть.
Ааа... круть. Просто привых alpha-num в идентификаторах использовать. Непривычно.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644685
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaNпропущено...

так как в модуле Prelude уже функция с таким именем есть.
Ааа... круть. Просто привых alpha-num в идентификаторах использовать. Непривычно.
в хаскеле апостроф - является нормой для объявления новых функций(или переменных констант) с тем же именем.
причем апострофы можно наращивать по наростающей.

x = ...
x' = f x
x'' = g x'
x''' = k x''
и так далее.

и в рекурсии вот так можно использовать:

f x = let x' = e x
in f x'
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644688
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZyK_BotaNmaytonпропущено...

У меня нет энтерпрайзного опыта в Scala. Просто хобби.
ну что такое case class знаешь?
Почитал. Теперь знаю. :) Портирование трассировщика луча на Scala - кст. тоже задача.
Я ее завершил но остались баги.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39644689
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonZyK_BotaNпропущено...

ну что такое case class знаешь?
Почитал. Теперь знаю. :) Портирование трассировщика луча на Scala - кст. тоже задача.
Я ее завершил но остались баги.
ну вот case class в скале, являются аналогом data в хаскеле
trait в скале, является аналогом typeclass в хаскеле
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39645790
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья. Топик актуален. Ноут умер внезапно (и хрен с ним) тайпаю с планшета. Но думаю к субботе будет фикс.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39645824
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДрузья. Топик актуален. Ноут умер внезапно (и хрен с ним) тайпаю с планшета. Но думаю к субботе будет фикс.
:)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39650372
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Up. Тайпаю на виртуальной клавиатуре. Ну ничего. Чуть позже разберусь. Хаскель ждет.
Надо собрать волю в кулак и добить этот бенчмарк.

Жук ты еще не устал?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39650456
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЖук ты еще не устал?
бу-га-га. я молод и полон сил.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39650462
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Йо-хо-хо. Тогда свистать всех наверх!
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39650656
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

брось это дело, ты туго въезжаешь :)
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39651306
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos, ну сорян. Спешу как могу.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39651397
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил векторное произведение и некоторую симуляцию модульного теста.
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
{-|
  This is the haskell-port of heckbert's card raytracer.
  Special thanks to Paul Heckbert

  See: http://tproger.ru/translations/business-card-raytracer

  12-May, 2018 : mayton - In beginning...
  28-May, 2018 : mayton - Fix for 'sum', Add console tests.
-}

import System.IO
import Text.Printf

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

data Vector = Vector { x :: Double, 
                       y :: Double, 
                       z :: Double } deriving (Show, Eq)


sprod :: Vector -> Vector -> Double
sprod v1 v2 = (x v1) * (x v2) + (y v1) * (y v2) + (z v1) * (z v2)

{- Vector sum of vector V1 and V2 -}
vsum :: Vector -> Vector -> Vector
vsum v1 v2 = (Vector 
               ((x v1) + (x v2)) 
               ((y v1) + (y v2)) 
               ((z v1) + (z v2)))

{--}
vprod :: Vector -> Vector -> Vector
vprod v1 v2 = (Vector
               (((y v1) * (z v2) - (z v1) * (y v2)))
               (((z v1) * (x v2) - (x v1) * (z v2)))
               (((x v1) * (y v2) - (y v1) * (x v2))))


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

{- Normalyze vector V -}
norm :: Vector -> Vector
norm v = prod v ( 1.0 / (sqrt (sprod v v) ) )

v1 = (Vector 3.0 4.0 5.0)
v2 = (Vector 4.0 5.0 6.0)

main = do
  putStrLn ("v1 = " ++ (show v1))
  putStrLn ("v2 = " ++ (show v2))
  putStrLn ("norm(v1) = " ++ (show (norm v1)))
  putStrLn ("vprod(v1,v2) = " ++ (show (vprod v1 v2)))
  putStrLn ("sprod(v1,v2) = " ++ (show (sprod v1 v2)))
  putStrLn ("prod(v1,2.0) = " ++ (show (prod v1 2.0)))
  putStrLn ("vsum(v1,v2) = " ++ (show (vsum v1 v2)))
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39651716
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так. Тайпаю с телефона.

Жук. Пока к тебе вопросов нету.
Я в процессе неспешной разработки.
Где-то по 1 часу вечером.

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

hackage.haskell.org/package/HUnit
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652834
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение темы. Я сделал несколько посторонних steps не по теме а так. Для общего развития.
Для разработотки поставил редактор Sublime. Потом установил какой-то Cabal (видимо ахренеть какая
нужна штука для Хаскел пакетов). И собственно пакет
для модульных тестов. Подозреваю что шаги по установке пакета где-то не завершены или еще чего-то
не хватает. Вобщем учебный пример - на скрине. И стектрейс тоже. Поскольку в этих Кабалах я не спец
и на чтение уходит много времени - прошу помочь кто знает.

Жук. Дружище. Отдыхай пока. Я тут закопался в мелочах. Я тебя призову когда будет real challange.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652836
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonCabal (видимо ахренеть какая
нужна штука для Хаскел пакетов)
и очень глючная. намучился я с этим кабалом в свое время.
некоторые пакеты, с такими плясками с бубном приходилось ставить...
а бывало что весь кабал ломался, приходилось чистить все кэши и переустанавливать его.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652837
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скинь мне скриптики для очистки кешей.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652840
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСкинь мне скриптики для очистки кешей.
я хаскелем - сто лет не занимался(лет шесть). ну и чистил ручками, довелось раз.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652841
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тогда психанул, и быстро все на эф-шарпе переписал (:
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652843
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю что это были каталоги
Код: plsql
1.
2.
~/.cabal
~/.cabal-sandbox


Верно?
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652845
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ так понимаю что это были каталоги
Код: plsql
1.
2.
~/.cabal
~/.cabal-sandbox



Верно?
не помню уже.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652846
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если будет знакомый с каббалистическим учением - то зови сюда.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652847
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу если будет знакомый с каббалистическим учением - то зови сюда.
был один очень годный хаскелист на работе, но он уже больше года как уволился.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652872
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня втянули в Телеграм. Там по сабжу есть две неплохие группы. Haskell. Haskell Start.
Читаю. Но честно говоря формат дискуссии меня ограничивает. Вобщем моё мнение совпадает
с мнением Анатолия Вассермана по поводу мессенжеров. Моя мысль никак не укладывается
в формат короткого сообщения. Вобщем я - больше блоггер чем собеседник в этих ваших
твиттерах и вайберах и прочих фейсбуках.
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652882
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тёплое ламповое общение это IRC
...
Рейтинг: 0 / 0
Haskell: вопросы
    #39652885
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рискну предположить что в тамошних топиках сверчат сверчки.
Комьюнити, мать его так.
...
Рейтинг: 0 / 0
123 сообщений из 123, показаны все 5 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell: вопросы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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