2012-01-01 46 views
9

Các đoạn dưới đây của mã là một phần của một nỗ lực nhằm tạo ra một hàm generateUpTo mà tạo ra một danh sách pAllSorted mà phụ thuộc vào nmax và do đó Rmax.Haskell - không trong phạm vi

nmax = rmax `div` 10 

pass = rmax `elem` mot 
fail = rmax `notElem` mot 

generateUpTo rmax = check rmax 
where 
     check pass = pAllSorted 
     check fail = error "insert multiple of 10!" 

Tuy nhiên, khi cố gắng để biên dịch, trình biên dịch đưa ra một thông báo lỗi "Không có trong phạm vi" về Rmax trong (những gì là ở đây) dòng 1,3 và 4.

(Làm thế nào) tôi có thể để lại rmax không xác định cho đến khi sử dụng chức năng generateUpTo?

+7

Đối với người giữ phiếu bầu xuống câu hỏi mới bắt đầu của Haskell, Sẽ rất hữu ích nếu bạn có thể biết, để lại nhận xét về lý do bạn thực hiện việc này. – Phyx

+1

chúng tôi sẽ out-upvote anh ta! :) nghiêm túc hơn, đã có rất nhiều sự lạm dụng cho SO của những người hỏi "làm công việc của tôi cho tôi" câu hỏi bài tập về nhà, có thể đó là một sai lầm. – gatoatigrado

+1

@Phyx Thực ra tôi cố gắng không bỏ phiếu cho những câu hỏi của người mới, nhưng có lẽ tôi có thể giải thích người viết xuống. Phần lớn các câu hỏi này là thuật ngữ 'quá cục bộ' là gì và nói chung là không thú vị. –

Trả lời

9

Nếu bạn muốn sử dụng rmax bên nmax, pass, và fail mà không đi qua nó như một đối số, bạn sẽ cần phải bao gồm nó trong where khối generateUpTo. Nếu không, nó theo nghĩa đen, "không nằm trong phạm vi". Ví dụ:

generateUpTo rmax = check rmax 
    where 
     check pass = pAllSorted 
     check fail = error "insert multiple of 10!" 
     nmax = rmax `div` 10 
     pass = rmax `elem` mot 
     fail = rmax `notElem` mot 

Nếu bạn muốn các chức năng này sẽ được sử dụng ở nhiều nơi, bạn có thể chỉ accect Rmax như một đối số:

nmax rmax = rmax `div` 10 
pass rmax = rmax `elem` mot 
fail rmax = rmax `notElem` mot 

Lưu ý - có vẻ như bạn cũng có một số vấn đề với định nghĩa của bạn của check ... giá trị passfail chỉ có các tranh cãi là check và không phải là các hàm bạn đã xác định ở trên.

Cập nhật

sử dụng nmax (phạm vi phiên bản bên ngoài-the-nơi-block), bạn sẽ cần phải vượt qua giá trị của Rmax với nó. Cũng giống như vậy: tuy nhiên,

nmax rmax -- function application in Haskell is accomplished with a space, 
      -- not parens, as in some other languages. 

Lưu ý, tên rmax trong định nghĩa của nmax không còn đáng kể. Các chức năng này đều giống hệt nhau:

nmax rmax = rmax `div` 10 
nmax a = a `div` 10 
nmax x = x `div` 10 

Tương tự như vậy, bạn không cần phải gọi nó với một giá trị mang tên rmax.

nmax rmax 
nmax 10 -- this is the same, assuming rmax is 10 
nmax foo -- this is the same, assuming foo has your 'rmax' value. 
+0

Nếu ** pAllsorted ** được định nghĩa ở một nơi khác và ** nmax ** được sử dụng trong định nghĩa đó, ** nmax ** vẫn nằm trong phạm vi nếu tôi sử dụng phương pháp này để khắc phục sự cố không? –

+0

trong ví dụ thứ hai của tôi ... có, điều đó sẽ hoạt động bên ngoài khối 'where'. Để gọi nó, bạn sẽ cần phải vượt qua bất cứ điều gì giá trị của rmax là nó mặc dù. ví dụ: 'nmax 10' hoặc' nmax myRmaxVal' –

+0

bạn có thể làm rõ về cách truyền giá trị của rmax cho nó? –

4

Chỉ cần đặt các định nghĩa của nmax, passfail vào where khoản của generateUpTo, cũng giống như bạn đã làm với check.

2
nmax rmax = rmax `div` 10 

pass rmax = rmax `elem` mot 
fail rmax = rmax `notElem` mot 

generateUpTo rmax = check rmax 
where 
    check pass = pAllSorted 
    check fail = error "insert multiple of 10!" 

Các Rmax là một tham số chức năng nó là undefined bên ngoài của hàm mà nó được khai báo. Trong ví dụ này, rmax trong hàm nmax hoàn toàn không liên quan đến rmax trong generateUpTo.