首页 > 解决方案 > 类型俄罗斯方块 - 卡住混合单子和纯代码

问题描述

我正在尝试在 haskell 中实现一些 vulkan 教程。

现在我坚持尝试从 c 翻译这段代码:

for (const char* layerName : validationLayers) {
    bool layerFound = false;

    for (const auto& layerProperties : availableLayers) {
        if (strcmp(layerName, layerProperties.layerName) == 0) {
            layerFound = true;
            break;
        }
    }

    if (!layerFound) {
        return false;
    }
}

return true; 

到目前为止,我到了这一点:

-- This has type (Int -> Text) -> Bool
let partOne = all (`elem` requiredValidationLayers) . flip map [0 .. realCount-1]
-- This has type Int -> IO Text
let partTwo i = do
        let layerProperty = advancePtr layerProperties i
        myField_ <- readStringField @"layerName" layerProperty
        pure $ toS myField_ :: IO Text

我觉得我在这里拥有所有的作品,但我可能会朝着完全错误的方向前进。

我怎么把这些东西放在一起?

谢谢

PS:好的,我只是注意到设置包含检查可能会被反转 - 没关系,为了这个问题,让我们假装它实际上很好

标签: chaskellmonadscode-translationdo-notation

解决方案


感谢所有评论者,我想我现在明白了:)

这就是它的样子(在一个do块内IO ()):

supportedLayers <- for [0 .. realCount-1] $ \i -> do
    let layerProperty = advancePtr layerProperties i
    myField_ <- readStringField @"layerName" layerProperty
    pure $ toS myField_ :: IO Text
return $ requiredValidationLayers `includes` supportedLayers

在哪里

includes :: Eq a => [a] -> [a] -> Bool
includes a b = all (`elem` b) a

推荐阅读