Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的递归重言式检查器_Haskell_Recursion_Logic - Fatal编程技术网

Haskell中的递归重言式检查器

Haskell中的递归重言式检查器,haskell,recursion,logic,Haskell,Recursion,Logic,(我知道存在一个on SO,但我不认为这是一个重复,因为我尝试实现的函数是递归的,不使用列表或lambda表达式。我想知道如何以这种方式实现它,即使它们在功能上是等价的,主要是为了更好地理解Haskell。) 我正在学习如何生成函数来检查给定的布尔函数是否是重言式。下面是我正在阅读的书中的一个示例函数,它检查带有1个变量的布尔函数: valid1 :: (Bool -> Bool) -> Bool valid1 bf = (bf True) && (bf False)

(我知道存在一个on SO,但我不认为这是一个重复,因为我尝试实现的函数是递归的,不使用列表或lambda表达式。我想知道如何以这种方式实现它,即使它们在功能上是等价的,主要是为了更好地理解Haskell。)

我正在学习如何生成函数来检查给定的布尔函数是否是重言式。下面是我正在阅读的书中的一个示例函数,它检查带有1个变量的布尔函数:

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