2014-05-05 19 views
5

Tôi có mã sau và tôi đã thử nhiều cách để viết, nhưng tôi không thể làm việc đó. Những gì tôi cần là sử dụng điều kiện if bên trong khối do.Lỗi phân tích cú pháp trên đầu vào 'if' khi cố gắng sử dụng điều kiện bên trong khối làm

palin :: IO() 
palin 
    = do line <- getLine 
     putStr line 
     if True 
     then putStr line 

Tôi đã thay đổi điều kiện thành sự thật chỉ để dễ dàng hơn. Tôi đã thử thêm câu else, nhưng tôi nhận được như vậy.

+2

Nếu bạn không muốn làm bất cứ điều gì trong người khác, sau đó bạn nên sử dụng 'khi'. – pat

Trả lời

11

Trong Haskell, biểu thức if-else không có nghĩa là "nếu đúng, thực thi foo; else, thanh thực thi", nhưng "nếu đúng, giá trị là foo; khác, giá trị là thanh". Vì lý do đó, bạn không thể bỏ qua các else, nhiều theo cùng một cách mà bạn không thể khi sử dụng toán tử ternary if (conditon ? foo : bar) bằng các ngôn ngữ khác. Trong trường hợp của bạn, phần then là một giá trị của loại IO(), vì vậy bạn cần một else cùng loại. Như bạn không muốn antyhing để thực sự xảy ra nếu điều kiện là sai, giải pháp trực tiếp nhất là sử dụng các giá trị giả IO(), return():

palin :: IO() 
palin 
    = do line <- getLine 
     putStr line 
     if True 
     then putStr line 
     else return() 

Bạn cũng có thể sử dụng when chức năng từ Control.Monad, trong đó có tác dụng tương tự :

import Control.Monad 

palin :: IO() 
palin 
    = do line <- getLine 
     putStr line 
     when True (putStr line) 
+0

Cảm ơn bạn! giải thích hoàn hảo! – DemianArdus

2

Bạn đang thiếu một người khác.

palin :: IO() 
palin = do 
    line <- getLine 
    putStr line --Probably better to use putStrLn? 
    if True then putStr line else putStr "hi" --Also consider putStrLn here? 

Bạn cần phải cung cấp một giá trị, nếu bạn đang đến từ Python, sau đó suy nghĩ về một cái gì đó giống như

a = "dogs" if 1 < 0 else "cats" đây, bạn cần phải cung cấp khác như không có nó việc giao biến sẽ không chạy.

2

Trong Haskell mọi thứ sau = là một biểu thức và biểu thức thường có giá trị. Ngay cả câu lệnh điều kiện cũng là biểu thức cũng như putStr "hi" và chúng có giá trị (trả về) của chúng. Trong trường hợp của if giá trị trả về là giá trị của nhánh tương ứng (sau đó hoặc khác). Trong trường hợp của putStr "hi" nó hơi hơn nữa tham gia, tôi sẽ không giải thích nó ở đây (xem IO và monads)

Vì vậy, cách chính xác để viết mã của bạn sẽ được như sau:

palin :: IO() 
palin = do line <- getLine 
      if True 
      then putStr line 
      else return() 
      -- this return has nothing to do with return in python 
      -- basically it means "do nothing" 
Các vấn đề liên quan