मैंने सोचा था कि ताकि आप की तरह साधारण रेंज जांच कर सकता है यह, हास्केल में मनमाने ढंग से श्रृंखलित तुलना करने के लिए स्वच्छ होगा अनुमान लगाने के लिए:हास्केल: GHC को प्रोत्साहित करना सही मध्यवर्ती प्रकार
x <= y < z
और
की तरह अधिक जटिल सामानx /= y < z == a
कहाँ उपरोक्त दो शब्दार्थ
x <= y && y < z
x /= y && y < z && z == a
बस को देखकर मैं के बराबर हैं मैं काम करने के लिए वाक्यविन्यास मिल सकता है।
तो मैं जिस तरह से वहाँ प्रकार कक्षाओं की एक जोड़ी का उपयोग करने का सबसे मिल गया:
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
module ChainedOrd where
import Prelude hiding ((<), (<=), (>), (>=), (==), (/=))
class Booly v a where
truthy :: v -> a
falsy :: v -> a
instance Booly a Bool where
truthy = const True
falsy = const False
instance Booly a (Maybe a) where
truthy = Just
falsy = const Nothing
class ChainedOrd a b where
(<),(>),(<=),(>=),(==),(/=) :: (Booly b c) => a -> b -> c
infixl 4 <
infixl 4 >
infixl 4 <=
infixl 4 >=
infixl 4 ==
infixl 4 /=
instance Ord a => ChainedOrd a a where
x < y = case compare x y of LT -> truthy y ; _ -> falsy y
x > y = case compare x y of GT -> truthy y ; _ -> falsy y
x <= y = case compare x y of GT -> falsy y ; _ -> truthy y
x >= y = case compare x y of LT -> falsy y ; _ -> truthy y
x == y = case compare x y of EQ -> truthy y ; _ -> falsy y
x /= y = case compare x y of EQ -> falsy y ; _ -> truthy y
instance Ord a => ChainedOrd (Maybe a) a where
Just x < y = case compare x y of LT -> truthy y ; _ -> falsy y
Nothing < y = falsy y
Just x > y = case compare x y of GT -> truthy y ; _ -> falsy y
Nothing > y = falsy y
Just x <= y = case compare x y of GT -> falsy y ; _ -> truthy y
Nothing <= y = falsy y
Just x >= y = case compare x y of LT -> falsy y ; _ -> truthy y
Nothing >= y = falsy y
Just x == y = case compare x y of EQ -> truthy y ; _ -> falsy y
Nothing == y = falsy y
Just x /= y = case compare x y of EQ -> falsy y ; _ -> truthy y
Nothing /= y = falsy y
कौन सा ठीक संकलित है, लेकिन काफी चेनिंग, मध्यवर्ती प्रकार की समस्या की वजह से अनुमति देने के लिए प्रतीत नहीं होता।
-- works
checkRange1 :: Ord a => a -> a -> a -> Bool
checkRange1 x y z = x `lem` y <= z
where lem :: Ord a => a -> a -> Maybe a
lem = (<=)
-- works
checkRange2 :: Ord a => a -> a -> a -> Bool
checkRange2 x y z = (x <= y) `leb` z
where leb :: Ord a => Maybe a -> a -> Bool
leb = (<=)
checkRange1
और checkRange2
काम ठीक है, क्योंकि वे दोनों मध्यवर्ती प्रकार पर एक बाधा डाल (या तो पहले की तुलना, या दूसरे के लिए एक तर्क के रूप का एक परिणाम के रूप में)।
-- error
checkRange3 :: Ord a => a -> a -> a -> Bool
checkRange3 x y z = (x <= y) <= z
जब मैं संकलक मध्यवर्ती प्रकार का अनुमान लगा देना करने की कोशिश है, हालांकि, यह मुझ पर भौंकता।
ChainedOrd.hs:64:30:
Ambiguous type variable `a0' in the constraints:
(ChainedOrd a0 a) arising from a use of `<='
at ChainedOrd.hs:64:30-31
(Booly a a0) arising from a use of `<=' at ChainedOrd.hs:64:24-25
Probable fix: add a type signature that fixes these type variable(s)
In the expression: (x <= y) <= z
In an equation for `checkRange3': checkRange3 x y z = (x <= y) <= z
वहाँ किसी भी तरह से मैं संकलक है कि यह मध्यवर्ती प्रकार a0
Booly a a0, ChainedOrd a0 a
satisifying रूप Maybe a
का उपयोग करना चाहिए समझा सकते है, के बाद से है कि केवल उदाहरण इसके बारे में पता है?
यह असफल रहा, क्या मैं एक और तरीका है जो मैं मनमाने ढंग से तुलना करने के लिए काम कर सकता हूं?
क्या आपको यह प्रश्न पढ़ने पर विचार आया था (http://stackoverflow.com/questions/9284350/why-does-1-in-1-0-true-evaluate-to-false)? जब मैंने इसे पढ़ा तो मैंने सोचा कि यह सुविधा कितनी उपयोगी है, फिर भी मजबूत मजबूत स्थैतिक टाइपिंग की अनुपस्थिति में खतरनाक है क्योंकि पाइथन ऑफर नहीं कर सकता है। दयालुता यह हैस्केल में अपनी तरह की प्रणाली के साथ काफी अच्छी तरह से काम नहीं कर रही है जो इस सुरक्षा की पेशकश करता है। – leftaroundabout
@ बाएंअराउंडबाउट वास्तव में, मुझे यह [जूलिया भाषा के लिए इस मैनुअल] से मिला है (http://julialang.org/manual/mathematical-operations/#Numeric+Comparisons) – rampion