takeWhile获取无限的IO列表

时间:2015-12-13 11:09:03

标签: functional-programming frege

我试图使用一个可能包含以下类型元素的无限列表:

#include< stdio.h> #include< string.h> #include< stdlib.h> #include< process.h> //USER-DEFINED FUNCTIONS char top_down(); char copy_function(); char compare_function(); //char adder_function(); void header(void); #define MAX 1000 void header() { printf("*-*-*-*-*TASK_PERFORMER*-*-*-*-*"); printf("\n\n"); } //PROGRAM STARTS HERE main() { //VARIABLE DECLARATION char x = { 0 }; //HEADING FUNCTION header(); //USER-DEFINED FUNCTION CONSISTING OF ALL INPUTS. top_down(); //TERMINAL-PAUSE system("pause"); } char top_down() { char s1[MAX] = { 0 }, s2[MAX] = { 0 }, x = { 0 }; printf("Enter the First String : \n"); fgets(s1, MAX, stdin); printf("\n"); printf("The Entered First String : \n"); printf("%s", s1); printf("\n"); printf("Enter the Second String : \n"); fgets(s2, MAX, stdin); printf("\n"); printf("The Entered Second String : \n"); printf("%s", s2); printf("\n"); printf("*-*-*-TYPE ANY OPTION TO PERFORM TASK-*-*-*"); printf("\n"); //GIVEN OPTIONS FOR SELECTOR printf("Enter one option from the following : \n\n"); printf("(a) To Copy one string to another. \n"); printf("(b) To Compare two string. \n"); printf("(c) To Add a string to the end of another string. \n"); printf("\n"); repeat: printf("Enter Your Option : \n"); scanf_s("%c", &x); printf("\n"); //OPTION-SELECTOR switch (x) { case 'a': copy_function(s1, s2); break; case 'b': compare_function(s1, s1); break; case 'c': //adder_function(s1, s2); break; default: printf("INVALID OPTION \n"); printf("Please Try Again \n"); goto repeat; break; return; } } char copy_function(char s_1[], char s_2[]) { int x = 0; x = strlen(s_2); printf("Second String will be copied to First string now \n"); //strcpy(s_1, s_2); strcpy_s(s_1, x, s_2); printf("\n"); printf("First String Output : \n"); printf("%s", s_1); return; } char compare_function(char s_1[], char s_2[]) { int a = 0, l1 = 0, l2 = 0, i = 0; printf("First String will be compared to Second String now \n "); //printf("\n"); if (strcmp(s_1, s_2) == 0) printf("Both String are equal to each other \n"); else if (strcmp(s_1, s_2) > 0) printf("First String is greater than Second String"); else printf("First String is lesser than Second String \n"); return; }

  • 我只对使用IO (Either Throwable a)类型的元素感兴趣。
  • 列表已排序。 Right个元素始终是第一个,然后是Right个元素

问题在于我使用的实现是错误的,因为函数Left评估无限列表,因此函数永远不会结束。

sequence

有关如何正确使用该列表的任何想法?

1 个答案:

答案 0 :(得分:2)

是的,这不适用于sequence

您需要执行类似

的操作
takeWhileRight (x:xs) = do
  y <- x
  case y of
      Right -> (y:) <$> takeWhileRight xs
      Left  -> pure []
takeWhileRight [] = pure  []

(未测试)。

请注意,仍然必须运行提供Left的第一个IO操作。这是不可避免的。