2011-10-25 21 views
15

Như đã lưu ý nhiều lần ở nơi khác (ví dụ: 1, 2, ...) tập lệnh trong haskell có thể khá mạnh mẽ.
Cách nhanh chóng cũng có thể là ghc expression evaluation mode. đây là những gì tôi thực sự tìm thấy bản thân mình bằng cách sử dụng nhiều hơn và nhiều hơn nữa (Tôi thực sự thích tính năng này trong ruby).
Một ví dụ nhiệm vụ nhỏ:
"Tìm hiểu tất cả các thư mục có chứa diffs git giữa các HEAD và một phiên bản cụ"Chế độ đánh giá biểu thức trong haskell cho kịch bản

git diff --stat 9e2b68 | ghc -e \ 
    "getContents >>= return.(Data.List.nub).map(fst.break('/'==).head.words).lines" 

này trông một chút vụng về, có lẽ bởi vì tôi không thực sự biết các chi tiết sử dụng ghc -e.
Cho rằng tất cả các phần thú vị chỉ là nub.map(fst.break('/'==).head.words).lines biểu hiện thực tế có vẻ hơi chói.

  • Làm cách nào để biết ghc về các mô-đun tôi cần sử dụng để tôi không cần phải đủ điều kiện sử dụng tên đầy đủ?
  • Tôi có thể làm cho Ghc nhận một số loại tệp cấu hình có chứa các mô-đun mà tôi thường xuyên sử dụng không?

Tôi thực sự đánh giá cao việc xem một số ví dụ từ các giai đoạn khác sẽ giúp tôi cải thiện cách tôi sử dụng haskell cho các loại tập lệnh nhỏ đó!

Sidenote: Commandline-foo wizards có lẽ sẽ cười vào điều này nhưng tôi cảm thấy thoải mái hơn nhiều khi sử dụng haskell sau đó bash scripting vì vậy đây là những gì tôi muốn sử dụng.

+0

Đối với chuỗi → Các hàm chuỗi Tôi thấy 'tương tác' ít phức tạp hơn:' ghc -e 'tương tác $ Chuỗi func> "'. Điều này thường kết thúc bằng "ghc -e" tương tác $ unlines. Bản đồ ( Chuỗi func>). Dòng "'. – Nefrubyr

+1

Là một fan của cả git và Haskell, người không phải là một "thủ thuật commandline-foo", một bài đăng trên blog, nơi bạn liệt kê một loạt các tập lệnh Haskell liên quan đến git chắc chắn sẽ được tôi quan tâm! – MatrixFrog

+1

@MatrixFrog Không bị giới hạn bởi git nhưng có thể vẫn còn thú vị với bạn: [Scripting with GHCs Evaluation Mode] (http://blog.coldflake.com/post/12412650749/scripting-with-ghcs-evaluation-mode) – oliver

Trả lời

8

Về module: ghc -e sử dụng tập tin ~/.ghci của bạn, vì vậy trong trường hợp này, bạn muốn thêm :m +Data.List với nó (import Data.List(nub) cũng được hỗ trợ từ GHC 7 hoặc lâu hơn).

Về gói: Bạn có thể sử dụng ghc-pkg hide somepackageghc-pkg expose somepackage để xác định nhóm mặc định của gói hiển thị (gói mặc định được hiển thị; có thể tôi hiểu sai câu hỏi của bạn).

Bạn có thể tìm thấy eddie hữu ích.

+0

cuộc gọi tốt với tệp .ghci! Không biết 'ghc -e' sử dụng cùng một tệp. – oliver

+0

liên quan đến các gói: Không, ẩn và phơi bày không phải là ý tôi. – oliver

+1

về eddie: trông rất đẹp ... thậm chí còn có tùy chọn cài đặt cabal. Đã không hoàn toàn tìm ra cách để văn bản đường ống cho nó nhưng tôi sẽ điều tra! bằng cách này ... FunctorSalad ... tên rất sáng tạo :) – oliver

5

Giống như FunctorSalad đã nói, ghc -e tải ~/.ghci để bạn có thể sử dụng nó để thêm bất kỳ bản mẫu nào mà bạn có thể sử dụng trong tập lệnh của mình. Trong trường hợp của bạn, bạn có thể thêm

let script f = getContents >>= return f 
import Data.List 

cho bạn ~/.ghci tập tin và sau đó chạy:

git diff ... | ghc -e "script.nub.map(fst.break(=='/').head.words).lines" 
+0

+1: Tôi đã tự hỏi những gì '((==) /)' được cho là có nghĩa là trong câu hỏi. – rampion

+0

đẹp! điều đó thực sự hữu ích! cảm ơn vì tiền hỗ trợ! cho phép tích hợp mượt mà hơn ... – oliver

+0

'((==) '/')' giống như '('/' ==)'. – augustss

5

Ngoài các cấu hình tiêu chuẩn cho mỗi tập tin .ghci (ngoài toàn cầu của bạn ~/.ghci, bạn có thể có các tệp .ghci chuyên biệt trong một số thư mục, sau đó sẽ được đọc trước đó), bạn cũng có thể chuyển một tệp nguồn Haskell làm đối số dòng lệnh, ghc -e "expression" path/to/Source.hs. expression sau đó sẽ được đánh giá trong ngữ cảnh module Source.

+0

cool ... không biết về tùy chọn có tệp .ghci đặc biệt trong thư mục hiện tại của bạn. – oliver

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