2013-04-23 35 views
5

Đây là mã của tôi:Không thể có được loại chữ ký làm việc cho hàm đệ quy đơn giản

test :: (Num a) => [a] -> a 
test []  = 0 
test [x:xs] = x + test xs 

Tuy nhiên, khi tôi chạy nó thông qua ghci như :l test, tôi nhận được lỗi này:

[1 trong tổng số 1] Biên dịch Chính (test.hs, interpreted)

test.hs:3:7: 
    Couldn't match type `a' with `[a]' 
     `a' is a rigid type variable bound by 
      the type signature for spew :: Num a => [a] -> a at test.hs:2:1 
    In the pattern: x : xs 
    In the pattern: [x : xs] 
    In an equation for `spew': spew [x : xs] = x + spew xs 
Failed, modules loaded: none. 

Cố gắng không cười :) đó là lần thử đầu tiên của tôi tại haskell. Bất kỳ trợ giúp hoặc giải thích nào đều tuyệt vời.

PS: Tôi biết điều này có thể dễ dàng thực hiện với màn hình đầu tiên, nhưng tôi đang cố gắng thực hành viết chữ ký của riêng mình. Cảm ơn trước!!

Trả lời

8

Bạn có nghĩa là

test :: (Num a) => [a] -> a 
test []  = 0 
test (x:xs) = x + test xs -- note round brackets 

với dấu ngoặc tròn.

[x:xs] là danh sách có một phần tử, chính nó là danh sách, trong khi (x:xs) là danh sách có phần tử đầu tiên x và đuôi xs.

Nếu bạn nhập length (1:[1,1,1]) bạn sẽ nhận được 4, nhưng nếu bạn nhập length [1:[1,1,1]] bạn sẽ nhận được 1 - yếu tố duy nhất là danh sách.

+1

Gah !! Tôi nên đã thấy điều đó! Cảm ơn bạn! –

+0

@AthanClark Chúng ta đều trải qua cảm giác này khi chúng ta học Haskell. – Dilawar

5

Bạn có thể có nghĩa là để phù hợp với danh sách như một toàn thể, không phải là yếu tố đầu tiên của danh sách:

test (x:xs) = ... 

Nếu bạn làm cách khác, mô hình có kiểu suy ra [[b]], vì vậy a == [b] theo chữ ký test s , vì vậy xs phải có loại [b], vì vậy test xs phải có loại b mà còn gõ a theo chữ ký của test, trong đó sẽ có nghĩa là a == [a], mà là một sự mâu thuẫn và dẫn đến sai số thống nhất :)

+0

Xin lỗi câu trả lời của người đàn ông AndrewC đã hoàn chỉnh hơn :) Cảm ơn bạn rất nhiều! –

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