Trong quá trình viết một máy tính RPN đơn giản, tôi có bí danh loại sau đây:Folding flatMap/ràng buộc hơn một danh sách các hàm (hay còn gọi là tên đó Combinator!)
type Stack = List[Double]
type Operation = Stack => Option[Stack]
... và tôi đã viết một đường tò mò nhìn mã Scala:
val newStack = operations.foldLeft(Option(stack)) { _ flatMap _ }
này có một ban đầu stack
các giá trị và áp dụng một danh sách các operations
để ngăn xếp đó. Mỗi thao tác có thể không thành công (tức là tạo ra một Option[Stack]
) để tôi sắp xếp chúng theo số flatMap
. Điều đó hơi khác thường về điều này (trong tâm trí của tôi) là tôi đang xếp chồng lên một danh sách các chức năng đơn thuần, thay vì xếp chồng lên một danh sách dữ liệu.
Tôi muốn biết liệu có một chức năng tiêu chuẩn để ghi lại hành vi "liên kết gấp" này hay không. Khi tôi đang cố gắng để chơi trò "Name That Combinator" trò chơi, Hoogle thường là bạn của tôi, vì vậy tôi cố gắng thực hiện tinh thần tương tự trong Haskell:
foldl (>>=) (Just stack) operations
Các loại ở đây là:
foldl :: (a -> b -> a) -> a -> [b] -> a
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Vì vậy, các loại bí ẩn foldl (>>=)
combinator của tôi, sau khi thực hiện các loại foldl
và (>>=)
dòng lên phải nộp là:
mysteryCombinator :: Monad m => m a -> [a -> m a] -> m a
... mà là một lần nữa những gì chúng ta muốn chờ đợi. Vấn đề của tôi là tìm kiếm Hoogle cho một chức năng với loại đó không mang lại kết quả nào. Tôi đã thử một vài hoán vị khác mà tôi nghĩ có thể là hợp lý: a -> [a -> m a] -> m a
(tức là bắt đầu với giá trị không đơn nguyên), [a -> m a] -> m a -> m a
(tức là với đối số bị lật), nhưng cũng không có may mắn. Vì vậy, câu hỏi của tôi là, không ai biết một tên chuẩn cho tổ hợp bí ẩn "gấp-ràng buộc" của tôi?
Tôi khuyên bạn không nên sử dụng việc thực hiện này của bộ kết hợp; Tôi tin rằng hầu hết các triển khai của '(>> =)' được dự định sẽ được sử dụng theo cách phù hợp, do đó, có khả năng tốt điều này có thể gây ra các vấn đề hiệu năng xấu (như một chồng '' ++) ' làm). – ehird
@ehird - Tôi không nghĩ rằng tôi hiểu ... Bạn sẽ đề xuất như thế nào khi áp dụng một chuỗi các hoạt động '[a -> ma]', theo thứ tự từ trái sang phải, bắt đầu từ 'a' hoặc' ma 'giá trị? Ngoài ra, hãy nhớ rằng tôi không hỏi một câu hỏi cụ thể về ngôn ngữ; đặc điểm hiệu suất sẽ khác nhau giữa Scala và Haskell (bạn có thể giả sử tôi đang sử dụng 'foldl'' cho độ nghiêm ngặt). Tất cả những gì tôi thực sự quan tâm là liệu điều này có một cái tên nổi tiếng hay không. – mergeconflict
Tôi nghĩ rằng điểm của ehird là 'foldr' có thể hiệu quả hơn vì nó có thể dừng sớm (trong trường hợp của' Nothing' chẳng hạn). –