2016-02-21 2 views
-1
x = do 
    first <- "mfwew" 
    let q = first 
    a <- q 
    let b = a 
    putStrLn (b) 
    return b 

Как использовать назначенную переменную «первым» на < - q?haskell как использовать предыдущую назначенную переменную

спасибо

Я хочу сделать что-то вроде этого

do 
     b <- func a 
     c <- func1 b 
     func2 c 

, но это не будет работать. Я знаю его, потому что тип ввода-вывода не соответствует, но есть ли другой способ сделать это? В частности, я хочу снова использовать b в x < - xxx b.

+2

Я не уверен, что вы хотите, чтобы ваш код делал - ваш вопрос непонятен. Не могли бы вы уточнить, может быть, с желаемым результатом? Соответственно, ваш код в настоящее время не проверяет тип; вы не можете иметь 'first <-" mfwew "и' putStrLn (b) 'в том же блоке' do'. –

+0

Привет, я только что отредактировал. – user3230613

+0

На этот вопрос нельзя ответить без типов 'func',' func1' и 'func2' и ожидаемого типа всего блока' do'. – Zeta

ответ

3

Если я прочитал ваш вопрос и комментарии прав, чем вы хотите просто использовать значение из func a в func1 .. и вы пытались императивом do -стиля но потом заметил, что это работает только для (в IO) -Monad (ы) ,

В этом случае let приходит довольно близко:

myResult a = 
    let b = func a 
     c = func1 b 
    in func2 c 

но в Haskell мы обычно делаем это с композицией вместо:

myResult a = func2 (func1 (func a)) 

который

myResult a = func2 . func1 . func $ a 

и, наконец, вы можете опустите пунктa получить точка-вольная:

myResult = func2 . func1 . func 

, если Вам нравится

+0

Мне нужно использовать b <- func a – user3230613

+0

, почему вы должны это использовать? – Carsten

2

Правило большого пальца, вы должны смотреть на тип ваших функций.

Когда функция возвращает IO (или любой монады вы работаете), используйте <- запустить монадическое действие, как в вашем коде

do 
    b <- func a 
    c <- func1 b 
    func2 c 

Когда функция просто возвращает значение, не окружив его монада, используйте let.

do -- do is not really necessary here... but let's play along 
    let b = func a 
    let c = func1 b 
    func2 c 

Обычно вам необходимо смешать оба. Например, если func является монадическим пока func2 нет, мы пишем

do 
    b <- func a 
    let c = func1 b 
    func2 c 

Подводя итог: проверьте тип ваших функций.

Смежные вопросы