मेरे पास 6 बिट ASCII को बाइनरी प्रारूप में परिवर्तित करने के लिए निम्न प्रोग्राम है।जीएचसी जेनरेटिंग रिडंडेंट कोर ऑपरेशंस
ascii2bin :: Char -> B.ByteString
ascii2bin = B.reverse . fst . B.unfoldrN 6 decomp . to6BitASCII -- replace to6BitASCII with ord if you want to compile this
where decomp n = case quotRem n 2 of (q,r) -> Just (chr r,q)
bs2bin :: B.ByteString -> B.ByteString
bs2bin = B.concatMap ascii2bin
इस निम्नलिखित मुख्य खंड का उत्पादन:
Rec {
$wa
$wa =
\ ww ww1 ww2 w ->
case ww2 of wild {
__DEFAULT ->
let {
wild2
wild2 = remInt# ww1 2 } in
case leWord# (int2Word# wild2) (__word 1114111) of _ {
False -> (lvl2 wild2) `cast` ...;
True ->
case writeWord8OffAddr#
ww 0 (narrow8Word# (int2Word# (ord# (chr# wild2)))) w
of s2 { __DEFAULT ->
$wa (plusAddr# ww 1) (quotInt# ww1 2) (+# wild 1) s2
}
};
6 -> (# w, (lvl, lvl1, Just (I# ww1)) #)
}
end Rec }
सूचना है कि ord . chr == id
, और इसलिए वहाँ एक अनावश्यक यहाँ ऑपरेशन है: narrow8Word# (int2Word# (ord# (chr# wild2)))
एक कारण GHC बेकार में इंट से परिवर्तित किया जाता है है - > चार -> Int, या यह खराब कोड पीढ़ी का एक उदाहरण है? क्या इसे अनुकूलित किया जा सकता है?
संपादित करें: यह जीएचसी 7.4.2 का उपयोग कर रहा है, मैंने किसी भी अन्य संस्करण के साथ संकलन करने की कोशिश नहीं की है। मुझे तब से पता चला है कि समस्या जीएचसी 7.6.2 में बनी हुई है, लेकिन अनावश्यक परिचालन जिथब पर मौजूदा हेड शाखा में हटा दिए जाते हैं।
हाँ, ठीक है। इनमें से अधिकतर मूल्य स्तर पर मौजूद हैं जो केवल प्रकारों को बदलने के लिए मौजूद हैं। चूंकि कोर टाइप किया गया है, यह आवश्यक है। –