2008-12-05 41 views
20

Một chút về câu hỏi của câu hỏi về tân tiến sĩ, nhưng tôi đã xem qua ví dụ này trong số tutorial examples của Haskell. Đối với "tìm ra yếu tố cuối cùng của một danh sách" có một số phiên bản rõ ràng, giống nhưỨng dụng Chức năng Haskell

last' [x] = x 
last' (_:xs) = last' xs 

Nhưng tôi không thể làm cho tinh thần của một phiên bản thay thế trình bày:

myLast' = foldr1 (const id) 

Vì vậy, trong cố gắng để làm ý nghĩa của những gì các ứng dụng của hàm id đang làm, tôi đã cố gắng trong ghci:

const id 1 2 -> gives 2 

này liên kết như thế này:

(const id) 1 2 -> gives 2 

Và không như thế này:

const (id 1) 2 -> gives 1 

Nhưng tôi không làm cho ý nghĩa của việc này. (const id) nên dịch sang một cái gì đó như

`(\x y->x) (\x->x)` 

Không nên trả về một hàm trả về id của phần tử đầu tiên? Hoặc, làm thế nào để làm cho chức năng (const id) hoạt động khác với const?

+1

Chào mừng bạn đến với câu lạc bộ 10k! –

+3

Tôi muốn cảm ơn học viện, nhà sản xuất của tôi, đạo diễn .... –

+0

loooooooool! Like: P – Nomics

Trả lời

30

Định nghĩa của const

const x = \_ -> x 

Do đó, (const id) là một chức năng mà phải mất một đối số và luôn luôn trả về id

const id 1 2 = (\_ -> id) 1 2 
      = id 2 
      = 2 

Định nghĩa của foldr1

foldr1 f [x] = x 
foldr1 f (x:xs) = f x (foldr1 f xs) 

Nếu chúng tôi có

myLast' = foldr1 (const id) 

sau đó

myLast' [x] = foldr1 (const id) [x] 
       {- definition of foldr1 -} 
      = x 

myLast' (x:xs) = foldr1 (const id) (x:xs) 
       {- definition of foldr1 -} 
       = (const id) x (foldr1 (const id) xs) 
       {- definition of const -} 
       = (\_ -> id) x (foldr1 (const id) xs) 
       {- function application -} 
       = id (foldr1 (const id) xs) 
       {- definition of id -} 
       = foldr1 (const id) xs 
       {- definition of myLast' -} 
       = myLast' xs 

mà đồng ý với định nghĩa của last'.

+1

ahhh. Không làm cho kết nối của const trả về hàm. Cảm ơn lời giải thích. –

+0

Đây là một lời giải thích tuyệt vời, và bước qua nó tôi có thể thấy nó hoạt động như thế nào. Nhưng là foldr1 (const id) thực sự là cách thành ngữ để làm một chức năng myLast? Ví dụ đầu tiên được đưa ra dường như rõ ràng hơn ... –

+2

Tôi sẽ không nói đó là thành ngữ ...Haskell chuyên viên máy tính thích làm việc ra làm thế nào để thể hiện những điều trong một "điểm miễn phí" phong cách, hoặc hoàn toàn về nếp gấp. Nó trở thành một loại câu đố lập trình. Phiên bản đầu tiên rõ ràng hơn nhiều. –

9

Tôi dựa nhiều vào số :t khi cố gắng hiểu Haskell. Trong trường hợp này:

Prelude> :t const id 
const id :: b -> a -> a

có thể giúp bạn xem điều gì đang diễn ra.

+3

Để làm rõ, ": t" là lệnh bạn có thể sử dụng trong GHCI để in loại biểu thức. –

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