Haskell中的递归重言式检查器
(我知道存在一个on SO,但我不认为这是一个重复,因为我尝试实现的函数是递归的,不使用列表或lambda表达式。我想知道如何以这种方式实现它,即使它们在功能上是等价的,主要是为了更好地理解Haskell。) 我正在学习如何生成函数来检查给定的布尔函数是否是重言式。下面是我正在阅读的书中的一个示例函数,它检查带有1个变量的布尔函数:Haskell中的递归重言式检查器,haskell,recursion,logic,Haskell,Recursion,Logic,(我知道存在一个on SO,但我不认为这是一个重复,因为我尝试实现的函数是递归的,不使用列表或lambda表达式。我想知道如何以这种方式实现它,即使它们在功能上是等价的,主要是为了更好地理解Haskell。) 我正在学习如何生成函数来检查给定的布尔函数是否是重言式。下面是我正在阅读的书中的一个示例函数,它检查带有1个变量的布尔函数: valid1 :: (Bool -> Bool) -> Bool valid1 bf = (bf True) && (bf False)
valid1 :: (Bool -> Bool) -> Bool
valid1 bf = (bf True) && (bf False)
对于2和3个变量:
valid2 :: (Bool -> Bool -> Bool) -> Bool
valid2 bf = (bf True True)
&& (bf True False)
&& (bf False True)
&& (bf False False)
valid3 :: (Bool -> Bool -> Bool -> Bool) -> Bool
valid3 bf = and [ bf p q r | p <- [True,False],
q <- [True,False],
r <- [True,False]]
其中n
是正在检查的布尔函数bf
中的变量数。当给定一个带有n>1个变量的布尔函数bf
时,该函数将分支为检查bf True
和bf False
,最终检查所有可能的真值组合。但当我尝试加载此函数时,Haskell给出了错误消息“在应用程序中键入错误”。有没有办法调整此函数的类型声明以使其正常工作
我是哈斯克尔的新手,所以简单的解释将非常感谢。提前谢谢。实际上,这很容易做到
{-# LANGUAGE FlexibleInstances #-}
class BooleanFunc f where
isTautology :: f -> Bool
instance BooleanFunc Bool where
isTautology = id
instance (BooleanFunc b) => BooleanFunc (Bool -> b) where
isTautology f = isTautology (f True) && isTautology (f False)
main = do
print . isTautology $ \a b c d -> True || a || b || c || d
print . isTautology $ \a b c d -> a || b || c || d
尝试使用
-98
选项运行拥抱。通常,您最好使用ghci
。
{-# LANGUAGE FlexibleInstances #-}
class BooleanFunc f where
isTautology :: f -> Bool
instance BooleanFunc Bool where
isTautology = id
instance (BooleanFunc b) => BooleanFunc (Bool -> b) where
isTautology f = isTautology (f True) && isTautology (f False)
main = do
print . isTautology $ \a b c d -> True || a || b || c || d
print . isTautology $ \a b c d -> a || b || c || d