LINUX.ORG.RU

программирование Haskell. list с клавиатуры

 


0

2

здрасьте здрасьте люди добрые. помогите исправить код на Haskell


module Main where

main::IO()

l=[8, 5, 9]
z x | x < 2 =do{a<-getLine; b<-return(read(a)::Int); return(l++[b]);   z(x+1);}
    | x == 3 = do{print l;}

main= z 0

чтобы была возможность добавить в список элементы с клавиатуры



Последнее исправление: Assembler (всего исправлений: 2)
Ответ на: удаленный комментарий

Я думаю ты хотел что то вроде монады State, если нужно сделать именно через монады.

Если же тебе всё равно (как делать, через монады или нет), то просто добавь ещё один аргумент для функции z - список. И начальный вызов будет main = z 0 [8, 5, 9].

AndreyKl ★★★★★
()
Ответ на: комментарий от AndreyKl

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

Assembler
() автор топика
Ответ на: комментарий от Assembler

Не добавляешь.

У тебя return(l++[b]) не последняя операция, а значит игнорируется. И в print попадает константа l.

Должно быть что-то вроде

module Main where

main::IO()

l=[8, 5, 9]
z x l | x < 2 =do{a<-getLine; b<-return(read(a)::Int); z (x+1) (l++[b]);}
      | x == 2 = do{print l;}

main= z 0 l
monk ★★★★★
()
Ответ на: комментарий от monk

А лучше сразу

module Main where
import Control.Monad

main::IO()

l= [8, 5, 9]

main= do
  r <- replicateM 2 readLn
  print $ r ++ l
monk ★★★★★
()

Как я понимаю, ты так и не прочитал документацию по языку?

hateyoufeel ★★★★★
()

Не знаю как так получилось что я ответил на сообщение анонимуса, но в удалённых monk вроде бы показал пример.

Zhbert, а нельзя отменить удаление каскадом неверных ответов?

AndreyKl ★★★★★
()

Кстати а зачем Haskell ботаешь? На нём ведь ничего толкового не сделали, только выглядит красиво

anonymous
()
Ответ на: комментарий от Assembler

Я не вижу в данной ситуации связи с ленивостью. На сколько я понял ты считаешь что return (l++[b]) должно поместить
l++[b] в качестве нового l в твоё текущее окружение. Но это работает не совсем так.

Вероятно тебе стоит прочитать как работает оператор монадического связывания хотя бы на примере Maybe. Может быть вот здесь https://wiki.haskell.org/All_About_Monads#Maybe_a_monad .

AndreyKl ★★★★★
()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от Assembler

Не ленивость, а константность.

Можно делать как в традиционных языках:

module Main where
import Data.IORef

main::IO()

main= do
  rl <- newIORef [8, 5, 9]
  let z x | x < 2 = do
             b <- readLn
             modifyIORef rl (\l -> l ++ [b])
             z $ x+1
          | x == 2 = readIORef rl >>= print
  z 0
monk ★★★★★
()
Ответ на: комментарий от monk

нет спасибо. мне интересно только ядро с как можно меньшим сахаром. нужно было понять списки. И константность языка, как указали, так вот она меня увела " в лес" на 4 часа, где я платул и если бы не форум))))))))

Assembler
() автор топика
Ответ на: комментарий от AndreyKl

спасибо, я читаю просто язык сложный для обычного студента деревенского техникума. поэтому без помощи уважаемых форумчан необойтись.

Assembler
() автор топика
Ответ на: комментарий от monk

Инновационные нанотехнологии, уже крутим в продакшне с хайлоадом 100500 млрд. запросов/сек.!

mertvoprog
()
18 октября 2021 г.
module Main where

import Text.Read (readEither)

main :: IO ()
main = z l 0

l :: [Integer]
l = [8, 5, 9]

z :: [Integer] -> Integer -> IO ()
z accumulator x
  | x < 2 = do
      a <- getLine
      b <- either fail pure $ readEither a
      z (accumulator ++ [b]) (succ x)
  | otherwise = print accumulator
unclechu
()
Последнее исправление: unclechu (всего исправлений: 1)
9 февраля 2022 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.