1

У меня есть куча условий, которые возвращают списки, есть ли способ оценить их, не давая каждому условию имя?Оценка и сбор результатов условий

Упрощенный пример:

conditions i j = c1 i j ++ c2 i j ++ c3 i j 

    where 
    c1 i j | i > 2  = ["x"] 
      | otherwise = [] 
    c2 i j | j > 5 = ["y", "a"] 
      | otherwise = [] 
    c3 i j | j > 10 = ["z"] 
      | otherwise = [] 
    c4 i j | j > 10 && i > 1 = ["z", "c", "hello"] 
      | otherwise = [] 

ответ

5

Вы можете определить оператор для этого:

infixl 1 *| 

(*|) :: [a] -> Bool -> [a] 
xs *| b | b = xs 
xs *| b  = [] 

conditions i j = (["x"]    *| i > 2) 
       ++ (["y", "a"]  *| j > 5) 
       ++ (["z"]    *| j > 10) 
       ++ (["z","c","hello"] *| j > 10 && i > 1) 

It'a также можно переписать последнюю строку в

++ (["z","c","hello"] *| j > 10 *| i > 1) 

, если это желательно по какой-то причине.

4

Это то, что вы ищете?

conditions i j = (if i > 2 then ["x"] else []) 
       ++ (if j > 5 then ["y","a"] else []) 
       ++ (if j > 10 then ["z"] else []) 
       ++ ... 
+3

', если б тогда [х] еще [] == '' [х | Ь] ', который, возможно, лучше, чтобы посмотрите, даже если это может смутить кого-то, кто никогда не сталкивался с этим. – user2407038

2

Я предпочитаю один:

conditions i j = (guard (i>2)    >> ["x"]) ++ 
       (guard (j>5)    >> ["y","a"]) ++ 
       (guard (j > 10 && i > 1) >> ["z", "c", "hello"]) 

Список злоупотреблений понимание:

conditions i j = [ x | i>2 ,    x <- ["x"] ] ++ 
       [ x | j>5 ,    x <- ["y","a"] ] ++ 
       [ x | j > 10 && i > 1 , x <- ["z", "c", "hello"] ] 

conditions i j = concat ([ ["x"]    | i>2 ] ++ 
          [ ["y","a"]   | j>5 ] ++ 
          [ ["z", "c", "hello"] | j > 10 && i > 1 ]) 
Смежные вопросы