Haskell: вопросы

mayton
Дата: 12.05.2018 11:52:14
Топик возник в продолжение 21404620

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

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

Prelude> infixl 6 *+*

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


Прокомментируйте ошибку и как фиксить.
ZyK_BotaN
Дата: 12.05.2018 12:36:33
mayton
Топик возник в продолжение 21404620

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

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

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)

код по типу такого:
(*+*) = (+)
infixl 6 *+*
mayton
Дата: 12.05.2018 17:09:56
Создал файлик tut02.hs
infixl 6 *+*
a *+* b = a^2 + b^2

-- 3 *+* 4

-- 3 (*+*) 4

(*+*) 3 4

:load в интерпретаторе
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.
mayton
Дата: 12.05.2018 17:12:34
Попробовал определить список констант. Что-то не так делаю. Пробелы и TAB-ы играют роль? Где? В каком месте?

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


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.
ZyK_BotaN
Дата: 12.05.2018 17:58:53
mayton
Создал файлик tut02.hs
infixl 6 *+*
a *+* b = a^2 + b^2

-- 3 *+* 4

-- 3 (*+*) 4

(*+*) 3 4


:load в интерпретаторе
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.

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

сие выражение:
(*+*) 3 4

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

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

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


или лучше:

x = 3 (*+*)  4
ZyK_BotaN
Дата: 12.05.2018 17:59:46
mayton,


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

а уже в интерпретаторе можешь писать
(*+*) 3 4

и получить ответ
ZyK_BotaN
Дата: 12.05.2018 18:02:24
mayton
Пробелы и TAB-ы играют роль? Где? В каком месте?

да. играют.
такого оператора как let в сорцах хаскеля нету(не интерпретатор), есть "let ... in ..", но это уже другая история.

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

width = 512 
    
height = 512
    
g = [ 
      0x0003C712,
      0x00044814,  
      0x00044818,  
      0x0003CF94,  
      0x00004892,  
      0x00004891,  
      0x00038710,
      0x00000010,
      0x00000010
    ]
ZyK_BotaN
Дата: 12.05.2018 18:07:57
ZyK_BotaN
такого оператора как let в сорцах хаскеля нету

венее он есть, но в рамках синтаксиса для монад.

работая в интерпретаторе, ты как-бы в монаде ио обитаешь, потому и юзаешь синтаксичейский сахар "let" для связывания значений. с рамках обычного кода, "let" не нужен.
ZyK_BotaN
Дата: 12.05.2018 18:08:39
ZyK_BotaN
но в рамках синтаксиса для монад.

do-нотация:
https://en.wikibooks.org/wiki/Haskell/do_notation
mayton
Дата: 12.05.2018 18:51:18
Давайте перегрузку оператора поскипаем. Пока не нужно.

По поводу let. Вроде помогло. +Я включил в notepad++ подсветку TAB и пофиксил некоторые
проблемы. Вобщем Haskell чувствителен к невидимым символам.