c - 类型俄罗斯方块 - 卡住混合单子和纯代码
问题描述
我正在尝试在 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:好的,我只是注意到设置包含检查可能会被反转 - 没关系,为了这个问题,让我们假装它实际上很好
解决方案
感谢所有评论者,我想我现在明白了:)
这就是它的样子(在一个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
推荐阅读
- reactjs - 如何将 React 中的 useState() 绑定到动态生成元素?
- jquery - 查找每个具有 attr 类型但没有元素类型的元素
- outlook-addin - System.EntryPointNotFoundException:'无法找到名为'的入口点?' 在 DLL 'mip_dotnet' 中。在 Outlook VSTO 加载项中的 CreateMipContext 上?
- swiftui - SwiftUi - 隐藏“返回”按钮和导航栏(出现几分之一秒)
- python - 如何按列内容过滤数据?
- c - PARSEC x264 基准测试中的奇怪行为
- vue.js - Vue.js 的 Toast UI 编辑器中的 v-model
- java - 如何根据启动标志启动@KafkaListener
- docker - Dockerfile 执行权限被拒绝
- javascript - 为什么javascript导入需要这么长时间?