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
và :.
đượ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
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ó. –
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? –