Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell: вопросы / 25 сообщений из 123, страница 1 из 5
12.05.2018, 11:52
    #39643553
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
Топик возник в продолжение 21404620

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

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

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

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



Прокомментируйте ошибку и как фиксить.
...
Рейтинг: 0 / 0
12.05.2018, 12:36
    #39643561
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
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
12.05.2018, 17:09
    #39643607
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
Создал файлик 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
12.05.2018, 17:12
    #39643608
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
Попробовал определить список констант. Что-то не так делаю. Пробелы и 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
12.05.2018, 17:58
    #39643611
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
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
12.05.2018, 17:59
    #39643612
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
mayton,


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

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


и получить ответ
...
Рейтинг: 0 / 0
12.05.2018, 18:02
    #39643613
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
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
12.05.2018, 18:07
    #39643614
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell: вопросы
ZyK_BotaNтакого оператора как let в сорцах хаскеля нету
венее он есть, но в рамках синтаксиса для монад.

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

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


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

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

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


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

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


зачем в скобки взял аргумент?
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell: вопросы / 25 сообщений из 123, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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