每当我有一个运算符部分,其左参数部分应用时,即:
(0 >)
Run Code Online (Sandbox Code Playgroud)
我只是简单地将运算符重写为前缀形式并继续计算:
(>) 0
Run Code Online (Sandbox Code Playgroud)
如何计算部分应用了正确参数的运算符部分的类型?
Ord这是数据类型实例的最小完整定义吗Maybe?这是对的吗 ?
instance Ord (Maybe a) where
compare (Just x) (Just y) | x < y = LT
| x > y = GT
| otherwise = EQ
compare _ _ = LT
Run Code Online (Sandbox Code Playgroud)
instance Ord (Maybe a) where
(Just x) <= (Just y) = x <= y
_ _ = False
Run Code Online (Sandbox Code Playgroud) Haskell 类型变量是隐式量化的。关键字forall出现在 后::。
例如,const输入签名
const :: a -> b -> a
Run Code Online (Sandbox Code Playgroud)
写为:
const :: forall a b. a -> b -> a
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何有效地推断签名
const :: forall a. a -> a -> a
Run Code Online (Sandbox Code Playgroud)
从这个定义来看。我尝试使用从一阶逻辑(例如普遍消除)中学到的概念,但无法从理论角度证明其合理性。
当然,这是有道理的,因为没有什么可以排除b与 相同a。
为什么我不能证明使用该推理规则是合理的?因为我不能对第二个量词使用消除,因为变量会发生冲突。我无法实例b化a.
我想创建以下声明:
data Color = B | W deriving Read
type Cell = (Color, Int) where 1 <= Int <= 255
Run Code Online (Sandbox Code Playgroud)
这个问题有什么解决办法吗?该类型实际上接受任何类型,Int但超出该范围的类型不应编译。