2012-11-11 32 views
12

Tôi chỉ mới bắt đầu giảng dạy bản thân mình Haskell. Mã này được cho là để làm yếu tố chính:Haskell - xác định một chức năng với bảo vệ bên trong một 'nơi'

divides :: Integer -> Integer -> Bool 
divides small big = (big `mod` small == 0) 

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

primeFactors :: Integer -> [Integer] 
primeFactors 1 = [] 
primeFactors n 
    | n < 1 = error "Must be positive" 
    | otherwise = let m = lowestDivisor n 
        in m:primeFactors (n/m) 

Tôi nhận được lỗi phân tích cú pháp trên dòng nhận xét. Tôi nghĩ rằng vấn đề của tôi có thể là lowestDivisorHelper có bảo vệ, nhưng trình biên dịch không biết liệu các vệ sĩ có thuộc về lowestDivisorHelper hoặc lowestDivisor. Làm thế nào để tôi có được điều này?

Chỉnh sửa: Tôi nên thêm rằng tôi không muốn xác định hàm trợ giúp ở cấp cao nhất để ẩn chi tiết triển khai. Việc nhập tệp không được thực hiện chức năng trợ giúp.

+3

"Nhập tệp không được thực hiện chức năng trợ giúp." Trong trường hợp này, chỉ cần không xuất nó. –

Trả lời

16
lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n where 
    lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

Bạn cần bắt đầu một tuyên bố mới với chức năng trợ giúp của bạn để bảo vệ đủ thụt lề bằng cách so sánh. (. Và bạn cũng quên một cuộc tranh cãi, n) này cũng sẽ làm việc:

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where 
    lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

nhưng điều này không:

lowestDivisor :: Integer -> Integer 
lowestDivisor n = lowestDivisorHelper 2 n 
    where lowestDivisorHelper m n 
     | (m `divides` n) = m -- these should belong to lowestDivisorHelper 
     | otherwise = lowestDivisorHelper (m+1) n 

Điểm mấu chốt là | phải được tiếp tục đến bên phải tên hàm.

Nói chung, bắt đầu một dòng mới tiếp tục dòng mới miễn là nó tiếp tục ở bên phải. Các lính canh phải tiếp tục từ tên hàm.

+0

Ah, tôi vừa viết một bình luận rằng ví dụ cuối cùng của bạn là tốt. – Vitus

Các vấn đề liên quan