базовые операторы управления haskell - оператор, который всегда выполняется, возможно? - PullRequest
3 голосов
/ 28 сентября 2010

Если бы я хотел сделать следующее:

function1 stuff
| condition1 = "yay" 
| condition2 = "hey" 
| condition3 = "nay" 

и я хотел получить утверждение, которое всегда выполнялось безоговорочно (например, «потому что»), как я мог это сделать? Строки являются заполнителями.

Спасибо!

Edit:

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

У меня есть функция, которая принимает два входа (списки списков).

Если дан пример ввода [[]] [[]], [[]]] (или [[]] [[["x"]], [[]]]), я хочу

  • проверить, существует ли четное количество [[]] на каждой стороне и, если это так, удалить их все
  • проверка на нечетное количество с каждой стороны, затем nub (удалить все, кроме одного)
  • несколько других похожих вещей

затем, после этого, объедините два входа (очищенные) и верните их. До сих пор я определился с синтаксисом охраны, после попытки case и if-then-else. Но это позволило бы мне протестировать только одну сторону (например), а затем после знака = присоединиться и вернуться. Если это не было чрезмерно долго ... Так что, признавая, что мне еще нужно многому научиться, как бы я поступил так в Haskell?

Ответы [ 3 ]

4 голосов
/ 28 сентября 2010

Ваши вопросы не относятся к функциональным языкам программирования, таким как Haskell. Ваш первый вопрос, я думаю, «как я всегда делаю А здесь, когда я тоже хочу сделать Б?». Ваш второй вопрос похож: «Как мне сделать А потом Б?». Эти вопросы имеют смысл для императивных языков (таких как ОО-языки), где ваша программа по существу сообщает компьютеру , как действовать. В функциональных языках, однако, вы говорите что вы хотите вычислить, но это полностью зависит от компилятора , как это делается (возьмите это с щепоткой соли, но это общая идея ).

Например, ваш второй вопрос имеет

number = number * 5
number = number * 2

На императивном языке это гласит: «обновить ячейку памяти с именем« число »с ее текущим содержимым, умноженным на 5; , затем обновить ячейку памяти с именем« число », с ее текущим содержимым, умноженным на 2».

В функциональном языке программирования эти операторы являются либо ошибкой (вы пытаетесь определить скалярную величину "число" в терминах самого себя), либо являются логическими выражениями ("число равно числу * 5?").

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

length []     = 0                 -- The empty list has zero items.
length (x:xs) = 1 + length xs     -- The non-empty list (x:xs) has one more item than xs.

Надеюсь, это поможет.

2 голосов
/ 28 сентября 2010

Единственная цель функции - вернуть значение.Однако если у вас есть общие черты, которые разделяет каждое условие, вы можете использовать where

function1 stuff
  | condition1 = "yay" ++ otherstuff
  | condition2 = "hey" ++ otherstuff
  | condition3 = "nay" ++ otherstuff
  where otherstuff = "!"
2 голосов
/ 28 сентября 2010

Если вы имеете в виду условие, которое успешно выполняется, если все остальные терпят неудачу, тогда просто используйте otherwise:

foo x
    | x == 0 = "yay"
    | x == 1 = "hey"
    | x >= 2 = "nay"
    | otherwise = "negative"

Если вы подразумеваете что-то еще под словом «всегда бегал», т.е.если другой тоже работает, то я думаю, что вы не так думаете об этом языке.Например, если у нас был синтаксис:

foo x
    | x == 1 = "one"
    | always = "any"

Тогда какое должно быть значение foo 1?

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