Первые шаги
От: kaa_t Россия  
Дата: 25.01.12 05:29
Оценка:
Добрый день всем.

string test(List<int> lst )
{
     foreach (int x in lst)
        if (x == 7) return "Yes";

     return "No";
}


вроде все просто, но почему то на немерле код усложняется.
test(lst)
  {
    mutable i= "No";

    foreach( x in lst)
       when (x ==7 ) {i="Yes"; break; } 

    i;
  }


Как по другому?
Re: Первые шаги
От: Jack128  
Дата: 25.01.12 05:38
Оценка:
Здравствуйте, kaa_t, Вы писали:

_>Как по другому?

В Nemerle примерно так:

test(lst: List<int>): string
{
  if (lst.Any(_ == 7)) "Yes" else "No"
}


в C# аналогично с точностью до синтаксиса:

string test(List<int> lst)
{
  return lst.Any(x => x == 7) ? "Yes" : "No"
}
Re[2]: Первые шаги
От: kaa_t Россия  
Дата: 25.01.12 06:39
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, kaa_t, Вы писали:


_>>Как по другому?

J>В Nemerle примерно так:

А если так:

string test(List<int> lst )
{
     foreach (int x in lst)
        if (x % 7 ) return MakeStr(x);

     return "No";
}
Re: Первые шаги
От: Ziaw Россия  
Дата: 25.01.12 06:55
Оценка: 3 (2)
Здравствуйте, kaa_t, Вы писали:

_>вроде все просто, но почему то на немерле код усложняется.


Потому, что насквозь имеративный код вы пытаетесь записать функционально. Это сложно. Для императивных конструкций есть макросы в пространстве имен Nemerle.Imperative

using Nemerle.Imperative;
using System.Console;

def test(lst)
{
  foreach (x in lst)
    when (x == 7) 
      return "Yes";

  "No"
}

WriteLine(test([1, 5, 7]));
WriteLine(test([1, 2, 3]));
ReadLine()


в функционально-рекурсивном стиле этот алгоритм записывается так:
using System.Console;

def test(lst)
{
  | 7 :: _    => "Yes"       // первый элемент 7?
  | []        => "No"        // список пуст?
  | _ :: tail => test(tail)  // рекурсивно вызываем функцию со списком без первого элемента
}


WriteLine(test([1, 5, 7]));
WriteLine(test([1, 2, 3]));
ReadLine()
Re[2]: Первые шаги
От: hardcase Пират http://nemerle.org
Дата: 25.01.12 08:30
Оценка: 2 (2) +2
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, kaa_t, Вы писали:


_>>вроде все просто, но почему то на немерле код усложняется.


Z>Потому, что насквозь имеративный код вы пытаетесь записать функционально. Это сложно. Для императивных конструкций есть макросы в пространстве имен Nemerle.Imperative


А можно и без них:

def lookup7(lst)
{
  result: {
    foreach (x when x == 7 in lst)
      result("Yes");
    "No"
  }
}
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.