Ryo*_*Oka 2 haskell three-valued-logic
是否有算法引导给定数量的三值逻辑值的所有可能组合?
例如,F(2)应该返回此列表:
t t
t u
t f
u t
u u
u f
f t
f u
f f
Run Code Online (Sandbox Code Playgroud)
该函数看起来像这样(在Haskell中):
data Tril = FALSE | NULL | TRUE
all :: Int -> [[Tril]]
all amount = ???
all1 :: [Tril]
all1 = join (all 1)
all2 :: [(Tril, Tril)]
all2 = map (\[f, s] -> (f, s)) (all 2)
all3 :: [(Tril, Tril, Tril)]
all3 = map (\[f, s, t] -> (f, s, t)) (all 3)
Run Code Online (Sandbox Code Playgroud)
您可以非常简单地将其作为列表理解:
all2 = [ (v1, v2) | v1 <- [FALSE, TRUE, NULL], v2 <- [FALSE, TRUE, NULL] ]
Run Code Online (Sandbox Code Playgroud)
你可以把它写成monadic do-block:
all2 = do
v1 <- [FALSE, TRUE, NULL]
v2 <- [FALSE, TRUE, NULL]
return (v1, v2)
Run Code Online (Sandbox Code Playgroud)
这让我们知道如何编写可变大小的:
all 0 = [[]] -- Note: Empty list with one empty item.
all n = do
v <- [FALSE, TRUE, NULL]
vs <- all (n-1)
return (v:vs)
Run Code Online (Sandbox Code Playgroud)
事实证明 - 这有点令人费解 - 这是该replicateM功能的净效应.它需要一个monadic动作,N次,并将结果收集在一起.
all n = replicateM n [FALSE, TRUE, NULL]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |