2012-10-30 32 views
12

Tôi có một đoạn mã Haskell trông như thế này:Loại bỏ "trường hợp" với các ngành trùng lặp khỏi Haskell Lõi

fst . f $ (Z :. i `div` 2) 

Z:. được lấy từ Repa thư viện và được định nghĩa như thế này:

data Z = Z deriving (Show, Read, Eq, Ord) 
infixl 3 :. 
data tail :. head = !tail :. !head deriving (Show, Read, Eq, Ord) 

Quyền biểu hiện của $ xác định chỉ mục mảng, trong khi f là hàm lấy chỉ mục đó và trả về một cặp. Đây biên dịch để lõi sau:

case f_a2pC 
     (case ># x_s32E 0 of _ { 
      False -> 
      case <# x_s32E 0 of _ { 
       False -> :. Z (I# (quotInt# x_s32E 2)); 
       True -> :. Z (I# (-# (quotInt# (+# x_s32E 1) 2) 1)) 
      }; 
      True -> 
      case <# x_s32E 0 of _ { 
       False -> :. Z (I# (quotInt# x_s32E 2)); 
       True -> :. Z (I# (-# (quotInt# (+# x_s32E 1) 2) 1)) 
      } 
     }) 
of _ { (x1_a2Cv, _) -> 
x1_a2Cv 
} 

Đối với tôi nó có vẻ rõ ràng (có lẽ không chính xác) rằng tuyên bố trường hợp giữa (một với ># x_s32E 0 như scrutinee) là không cần thiết, vì cả hai chi nhánh là giống hệt nhau. Tôi có thể làm gì để loại bỏ nó không? Tôi biên dịch mã của tôi bằng cách sử dụng các tùy chọn GHC được đề xuất trong tài liệu Repa: -O2 -Odph -fno-liberate-case -funfolding-use-threshold1000 -funfolding-keeness-factor1000

+5

Trừ khi 'i' có thể âm tính một cách hợp pháp, bạn nên sử dụng' quot' thay vì 'div'. Điều đó sẽ khắc phục nó. –

+1

Bạn chính xác - điều này khắc phục được sự cố của tôi. Bạn có thể đăng nhận xét đó làm câu trả lời để tôi có thể chấp nhận nó không? –

Trả lời

12

Thực tế hai nhánh của case ># x_s32E 0 of là giống nhau và do đó rằng case là không cần thiết. Có vẻ như sự kết hợp case cho các nhánh giống hệt nhau không chạy sau khi cả hai nhánh trở nên giống nhau - có thể đáng để báo cáo lỗi. This one có thể thích hợp, nhưng vì cốt lõi được tạo ra cho ước số âm là tốt, tôi đã nộp new bug.

Sử dụng đơn giản quot - nếu i không thể phủ định hợp pháp - trực tiếp ánh xạ tới toán tử phân chia máy làm cho mã đơn giản hơn để không cần tạo chi nhánh.

+0

Cảm ơn! Tôi không chắc liệu đây có phải là lỗi trong GHC hay việc sử dụng các tùy chọn biên dịch không chính xác của tôi không. Tôi sẽ cố gắng giảm vấn đề này xuống ví dụ làm việc tối thiểu và nếu nó vẫn tồn tại, tôi sẽ điền vào một lỗi. –

+0

Tôi đã thực hiện một chút giảm và mở một vé mới. –

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