scr*_*avy 11 lambda haskell types variadic-functions typeclass
是否可以在没有FlexibleInstances的情况下表达以下Haskell程序,即在纯Haskell2010中?
{-# LANGUAGE FlexibleInstances #-}
class Funk a where truth :: a -> [Bool]
instance Funk [Bool] where truth = \x -> x
instance Funk Bool where truth = \x -> [x]
instance Funk b => Funk (Bool -> b) where
truth f = concat [truth (f True), truth (f False)]
Run Code Online (Sandbox Code Playgroud)
这是受如何编写Haskell函数的答案的启发,该函数将可变函数作为参数.
我怀疑问题是,它truth
返回的东西不是它作为参数所使用的函数(它返回Bool
,而不是[Bool]
).
这个片段的目的是给出一个布尔函数的所有可能配置的所有评估的列表,即
Main> truth (\x y -> x && y)
[True,False,False,False]
Main> truth (\x y -> x || y)
[True,True,True,False]
Run Code Online (Sandbox Code Playgroud)
最后,要打印一个真值表,如下所示(参见本文末尾的样板,看看产生这个的代码):
Main> main
T T T | T
T T F | T
T F T | T
T F F | F
F T T | T
F T F | F
F F T | T
F F F | T
Run Code Online (Sandbox Code Playgroud)
这是一些用于测试和可视化的样板代码,该功能的用途是:
class TruthTable a where
truthTable :: Funk f => f -> a
instance TruthTable [String] where
truthTable f = zipWith (++) (hCells (div (length t) 2)) (map showBool $ truth f)
where
showBool True = "| T"
showBool False = "| F"
hCells 1 = ["T ", "F "]
hCells n = ["T " ++ x | x <- hCells (div n 2)] ++ ["F " ++ x | x <- hCells (div n 2)]
instance TruthTable [Char] where
truthTable f = foldl1 join (truthTable f)
where join a b = a ++ "\n" ++ b
instance TruthTable (IO a) where
truthTable f = putStrLn (truthTable f) >> return undefined
main :: IO ()
main = truthTable (\x y z -> x `xor` y ==> z)
xor :: Bool -> Bool -> Bool
xor a b = not $ a == b
(==>) :: Bool -> Bool -> Bool
a ==> b = not $ a && not b
Run Code Online (Sandbox Code Playgroud)
aug*_*tss 12
没问题:
class Funk a where truth :: a -> [Bool]
instance (IsBool a) => Funk [a] where truth = map toBool
instance Funk Bool where truth = \x -> [x]
instance (IsBool a, Funk b) => Funk (a -> b) where
truth f = concat [truth (f $ fromBool True), truth (f $ fromBool False)]
class IsBool a where
toBool :: a -> Bool
fromBool :: Bool -> a
instance IsBool Bool where
toBool = id
fromBool = id
Run Code Online (Sandbox Code Playgroud)
如果你愿意,你甚至可以制作'荣誉布尔',比如0和1等整数.
归档时间: |
|
查看次数: |
332 次 |
最近记录: |