총알 지옥 게임을위한 작은 스크립트 엔진을 작성하려고하는데 F #에서 그 작업을하고 싶습니다. 개념적으로 C# 코드를 작성했지만 F #으로 이식하는 데 문제가 있습니다. C# 코드는 아래에 게시되어 있으며 F #으로 이식하는 데 도움이 필요합니다. 일치하는 F # 코드가 상당히 작아지는 느낌이 들었습니다. 나는 어떤 종류의 창의적인 솔루션에 대해서도 개방적입니다.F # : C#에서 F #로 변환하는 데 도움이 필요합니다.
interface IRunner
{
Result Run(int data);
}
struct Result
{
public Result(int data, IRunner next)
{
Data = data;
Next = next;
}
public int Data;
public IRunner Next;
}
class AddOne : IRunner
{
public Result Run(int data)
{
return new Result(data + 1, null);
}
}
class Idle : IRunner
{
public Result Run(int data)
{
return new Result(data, null);
}
}
class Pair : IRunner
{
IRunner _one;
IRunner _two;
public Pair(IRunner one, IRunner two)
{
_one = one;
_two = two;
}
public Result Run(int data)
{
var res = _one.Run(data);
if (res.Next != null)
return new Result(res.Data, new Pair(res.Next, _two));
return new Result(res.Data, _two);
}
}
class Repeat : IRunner
{
int _counter;
IRunner _toRun;
public Repeat(IRunner toRun, int counter)
{
_toRun = toRun;
_counter = counter;
}
public Result Run(int data)
{
var res = _toRun.Run(data);
if (_counter > 1)
{
if (res.Next != null)
return new Result(res.Data,
new Pair(res.Next,
new Repeat(_toRun, _counter - 1)));
return new Result(res.Data, new Repeat(_toRun, _counter - 1));
}
return res;
}
}
class Sequence : IRunner
{
IEnumerator<IRunner> _runner;
public Sequence(IEnumerator<IRunner> runner)
{
_runner = runner;
}
public Result Run(int data)
{
var res = _runner.Current.Run(data);
bool next = _runner.MoveNext();
if (res.Next != null)
{
return new Result(res.Data,
new Pair(res.Next, new Sequence(_runner)));
}
return new Result(res.Data, new Sequence(_runner));
}
}
나는 F #이 파이썬과 C#보다 더 비슷하다는 것을 알게되었다. 나는 먼저 파이썬으로 번역 할 것이고, 그 언어로 (읽기 쉽기 때문에) 단단히하고 계속 진행할 것이다. –
필자는 F #에 익숙하지 않지만 기능 코드를 개념화하기 위해 OO 코드를 작성하는 것은 나에게 좋은 생각처럼 들리지 않습니다. – pmr
음, 적어도 FP를 염두에두고 작성했습니다. OO를 사용하는 유일한 방법은 물건을 멋지게 컴파일하는 것입니다. 누구나 코드를 스크롤 영역에 넣는 방법을 알고 있으므로 그렇게 크지는 않습니까? – rysama