У меня есть 2 списка, которые я пытаюсь заполнить. При чтении из stdin, в зависимости от значения одной из прочитанных вещей, я хочу добавить в другой список. Пример,Haskell добавить к списку условно
import Control.Monad(replicateM)
main = do
n <- getLine
let l1 = [], l2 = []
in replicateM (read n) (getLine >>= (\line ->
case line of "Yes" ->
-- do something with line
-- and append value of that thing to l1
"No" ->
-- do something else
-- append this value to l2
putStrLn line))
Я понимаю, что приведенный выше код имеет синтаксические ошибки и такие, но, надеюсь, вы можете увидеть, что я пытаюсь и предложить что-то.
Это ответ, который я придумал
В то время как мы в этом, может кто-нибудь объяснить, почему это дает мне бесконечный список:
let g = []
let g = 1:g
-- g now contains an infinite list of 1's
Это то, что я наконец придумал с:
import Control.Monad(replicateM)
import Data.Either
getEither::[String] -> [Either Double Double]
getEither [] = []
getEither (line:rest) = let [n, h] = words line
fn = read f :: Double
e = case heist of "Yes" -> Left fn
"No" -> Right fn
in e : getEither rest
main = do
n <- getLine
lines <- replicateM (read n) getLine
let tup = partitionEithers $ getEither lines :: ([Double], [Double])
print tup
Не знаете, как fmap
могли быть использованы в данном случае
Что это '<$>' символ? – smac89
@ Smac89 Это символ оператора для 'fmap' – Sibi
@ Smac89' (<$>) 'может быть записан многими другими способами, один из которых может быть вам знаком:' fmap', 'liftA',' liftM'. Вы можете также думать об этом как '\ f ma -> do {a <- ma; return (f a)} ', хотя он немного более общий. –