2013-11-17 3 views
1

Есть ли способ (возможно, какая-то прагма или расширение (я использую GHC)), которые позволяют объявлять разные шаблоны функции отдельно?Отдельное объявление функций в haskell

Например, я могу сделать:

fun1 1 = "1" 
fun1 2 = "a" 
fun1 3 = "4" 
fun1 4 = "3" 

Но я не можно сделать:

fun1 1 = "1" 
fun1 2 = "a" 
fun1 3 = "4" 

a = 3 -- Just some code here. 

fun1 4 = "3" 

я. е. Мне нужно что-то, чтобы удалить это ограничение.

Мне это нужно в какой-то «игре», где прежний код не может редактировать.

Спасибо заранее!

+0

Я честно сомневаюсь, что вам НУЖДАЕТСЯ эта функция. Что вы на самом деле пытаетесь сделать? – jwodder

+0

@jwodder Да, мне НУЖНО. Я играю в особой игре, где я должен добавить новую функциональность БЕЗ редактирования предыдущего кода. –

ответ

4

Насколько я знаю, это невозможно. Несколько определений, подобных этому, - это просто синтаксический сахар более case и, следовательно, не являются ужасно сильными синтаксическими абстракциями. Это просто не обязательно.

Возможно, вам удастся использовать код haskell-src package для анализа кода Haskell и создания инкрементного интерфейса для вашей игры.

2

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

Если не существует важной структурной причины, было бы лучше придерживаться обычного действительного синтаксиса - легче понять, все ли определение в одном месте.

Однако, возможно, было бы лучше, чтобы структурировать ее по-другому, чтобы достичь того, чего вы хотите:

  • Вы можете использовать Data.Map создать несколько подкарты в разных частях кода, а затем склеить их все вместе некоторый подходящий этап.

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

  • Вы можете хранить ваши данные в более Haskell-дружески

    • Вы можете сериализацию его с помощью binary пакета, который быстро, и читать его во время выполнения.

    • Вы можете использовать Серверный агностик Persistent

    • Слишком много других вариантов Йесода здесь

  • Вы можете использовать тип союза (как Either) для входа в fun1, а затем распространять определение кода, но напишите унифицированную функцию, которая проверяет ввод и помещает его в соответствии с категорией.

Это трудно понять, что лучше без каких-либо знаний о том, что вы пытаетесь сделать, но ослабляя правила sytnax не чувствуете себя как хороший шаг вперед.

+0

Я имел в виду, что я играю в какой-то игре, где я должен добавить что-то новое в программу, но не могу редактировать предыдущий код. Спасибо вам! –

Смежные вопросы