2010-09-26 14 views
10

Tôi đang làm việc theo cách của mình qua cuốn sách The Haskell Road to Logic, Maths and Programming. (Tôi chỉ là giữa chừng thông qua chương 1, nhưng tôi thích nó cho đến nay và có ý định tiếp tục.) Tôi đã đọc qua phần 1.5 "Chơi trò chơi Haskell" trong đó "bao gồm một số ví dụ khác để làm quen với [Haskell] ". Cho đến nay tôi đã học về các hàm, khai báo kiểu, phương trình được bảo vệ, một chút về kết hợp mẫu danh sách và trong đó & cho phép.Tại sao tôi nhận được "Các mẫu không đầy đủ chức năng ..." khi tôi gọi hàm chuỗi con Haskell của mình?

Tôi đang mắc kẹt trên tập 1,17, trong đó đòi hỏi chúng ta phải viết một hàm substring :: String -> String -> Bool nơi:

  1. nếu xs là tiền tố của ys, xs là một chuỗi con của ys
  2. nếu ys bằng y: ys' và xs là một chuỗi con của ys', xs là một chuỗi con của ys
  3. không có gì khác là một chuỗi con của ys

tôi đã sử dụng chức năng tiền tố cung cấp trong một ví dụ trước:

prefix :: String -> String -> Bool 
prefix [] ys = True 
prefix (x:xs) [] = False 
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys 

Và sau đó thử:

substring :: String -> String -> Bool 
subsstring xs [] = False 
substring xs (y:ys) | prefix xs (y:ys) = True 
        | substring xs ys = True 
        | otherwise  = False 

... và có thể hoán vị khác về điều này.

Khi tôi chạy substring "abc" "xxxabcyyy" tôi nhận được True, nhưng khi tôi chạy substring "abc" "xxxabyyy" tôi nhận được "* Ngoại lệ: substring.hs: (3.0) - (5,45): mô hình không đầy đủ chức năng chuỗi con". Tôi không thể hiểu tại sao. Tôi không hiểu làm thế nào có thể có các mẫu không đầy đủ khi tôi sử dụng "nếu không".

BTW, sách chưa được bao trả nếu-thì-người khác. Tôi muốn giữ cho nó ra khỏi giải pháp của tôi, cho bây giờ.

Trả lời

12

Bạn có một lỗi đánh máy trong tên hàm:

subsstring xs [] = False 

Do typo này tuyên bố một chức năng mới subsstring, không phải là một trường hợp của substring chức năng.

Chính hàm substring sau đó không có bất kỳ trường hợp nào khớp với thông số thứ hai là [].

+4

Tôi không thể quyết định có nên xấu hổ vì tôi lãng phí thời gian của bạn với lỗi đánh máy hay vui lòng giải pháp của tôi đã hoạt động ngoại trừ lỗi đánh máy. Cảm ơn. –

+2

Điều này thật thú vị. Bạn có thể có một trong những loại hệ thống phức tạp nhất xung quanh, một lỗi đánh máy đơn giản không thể bị bắt bởi nó. – gawi

+2

đó là những cảnh báo. – muhmuhten

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