- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是 ST
中选择排序的实现。单子(monad)。输入数组被复制到 STUArray s Int Int
与 thaw
,然后副本就地排序。
selectionSort :: UArray Int Int -> UArray Int Int
selectionSort arr = runSTUArray $ do
let (l, n) = bounds arr
a <- thaw arr
forM_ [l..n] $ \i -> do
minIdx <- newSTRef i
forM_ [i..n] $ \j -> do
currentMin <- readSTRef minIdx
jVal <- readArray a j
minVal <- readArray a currentMin
when (jVal < minVal) (writeSTRef minIdx j)
currentMin <- readSTRef minIdx
iVal <- readArray a i
minVal <- readArray a currentMin
writeArray a i minVal
writeArray a currentMin iVal
return a
FlexibleContexts
,我想将类型概括为:
(IArray UArray a, Ord a, Ix i, Enum i) => UArray i a -> UArray i a
Could not deduce (MArray (STUArray s) a (ST s))
arising from a use of `thaw'
from the context (IArray UArray a, Ord a, Ix i, Enum i)
selectionSort
的约束允许这种概括?
最佳答案
array
的类 API不幸的是没有正确隐藏s
状态参数。当你写 runSTUArray action
, action
将 s
作为输入类型参数。在 selectionSort
的类型注释中我们必须写MArray (STUArray s) a (ST s)
,但这没有意义,因为 s
在运行的操作中使用的参数甚至不在此处的范围内。提s
这里只是介绍一个新的不同s
参数,因此有歧义错误。
constraint
package 对这类事情有一个很好的解决方案。与 Forall
来自 Data.Constraint.Forall
我们可以表示,对于类型参数的任意选择,约束必须成立。在我们的例子中,我们可以表示 MArray (STUArray s) a (ST s)
必须持有任意s
,并在 ST
内我们可以将量化约束实例化为特定的 s
我们需要的。
{-# language UndecidableInstances, ScopedTypeVariables #-}
import Data.STRef
import Control.Monad
import Control.Monad.ST.Strict
import Data.Constraint.Forall
import Data.Constraint
import Data.Proxy
Forall
中的包装类。 .
class (MArray (STUArray s) a (ST s)) => MArray' a s
instance (MArray (STUArray s) a (ST s)) => MArray' a s
Forall (MArray' a)
成为一个约束,我们可以从中生成
MArray' a s
任意
s
的约束, 和
MArray' a s
通过父类(super class)
MArray (STUArray s) a (ST s)
暗示约束(我们实际需要)。
s
输入类型参数更加明确,所以我们可以在正文中引用它:
runSTUArray' :: (forall s. Proxy s -> ST s (STUArray s i e)) -> UArray i e
runSTUArray' f = runSTUArray (f Proxy)
selectionSort
现在可以写出来,我们观察到它可以专门化为以前的类型:
selectionSort ::
forall i a.
(IArray UArray a, Ord a, Ix i, Enum i, Forall (MArray' a))
=> UArray i a -> UArray i a
selectionSort arr = runSTUArray' $ \(s :: Proxy s) -> do
let (l, n) = bounds arr
-- we use "inst" and a type annotation on its result to instantiate
-- the Forall constraint to the current "s"
case inst of
(Sub (Dict :: Dict (MArray' a s))) -> do
a <- thaw arr
forM_ [l..n] $ \i -> do
minIdx <- newSTRef i
forM_ [i..n] $ \j -> do
currentMin <- readSTRef minIdx
jVal <- readArray a j
minVal <- readArray a currentMin
when (jVal < minVal) (writeSTRef minIdx j)
currentMin <- readSTRef minIdx
iVal <- readArray a i
minVal <- readArray a currentMin
writeArray a i minVal
writeArray a currentMin iVal
return a
selectionSort' :: UArray Int Int -> UArray Int Int
selectionSort' = selectionSort
关于haskell - 如何概括这种就地选择排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41130707/
我正在寻找一种简单的方法来编写函数 mapAndUnzip :: (Functor f) => (a -> (b,c)) -> f a -> (f b, f c) 我并不完全相信 Functor是一个
我的代码是这样的: if(country == china) { getCNData(); } else { getDefaultDataForallCountries(); } 现在我需要为其他国家
在处理使用类型类模式的 Scala 项目时,我遇到了语言如何实现模式的严重问题:由于 Scala 类型类实现必须由程序员而不是语言管理,因此任何变量属于一个类型类永远不会被注解为父类型,除非它的类型类
我正在尝试在 R 中创建一个公式,其形式为 输出~Var1+Var2+Var3 用于模型。它的工作方式似乎是你给你想要预测的变量名,波浪号,你想用作预测变量的变量名,然后在后面的参数中你给出包含这些变
我正在使用一堆类型的宏: #define Q31_TO_Q30 (31-30) #define Q31_TO_Q20 (31-20) #define Q25_TO_Q15 (25-15) etc. 我
为了提高工作效率,我使用以下函数来了解我必须为哪些函数设置别名,因为我最常使用它们: function mu() { if [[ $# -eq 0 ]]; then histo
我有几个文本框。我想在每次按下回车键时将用户指向下一个文本框。文本框已正确设置 Tabindex。 我有这样的东西: private void textBox_Description_KeyPres
有什么方法可以将列约束应用于我的所有 GridPanes 列。我有各种 GridPane 控件,我希望它们共享以下列约束: 可以用css来实现吗? 编辑 我最终做了这样的事情。但它不起作用(我的列宽
我正在尝试在 Swift、Xcode 7.3(所以是 Swift 2.2)中创建一个通用类,但我似乎无法让它通过编译器: protocol Struct1Protocol { } struct Str
我正在做一个 JavaScript 游戏作业,只是尝试玩一下 Canvas 。我的任务是使用激光源、镜子和目标物体进行激光游戏。 我刚刚做了一个丑陋的硬编码示例: 'use strict'; func
我正在尝试从任何公共(public) REST API 获取响应并对其进行处理(解析并放入数据结构)。从 API 获取此响应时,我想使用一些分页功能。我提到了this ,该问题讨论了特定 API 的分
我有一个与 Guice 的机器人腿示例非常相似的用例,只是我不知道我有多少条“腿”。因此我不能使用机器人腿示例所需的注释。 我希望使用 Guice 的 Multibindings 扩展将所有这些“腿”
(按标题道歉,我不能做得更好) 我的问题是找到一些通用的结构或“标准”函数来执行下一件事: xmap :: (a -> b) -> f a -> g b 然后,我们不仅可以映射元素,还可以映射整个结构
haskell 中是否有一个函数可以概括 Maybe 和 Either 函数? 例如,我正在想象一个这样的函数: generalizedFunc :: SOMETHING m => b -> (a -
下面函数模板的目标是取任意unordered_map并产生一个新的unordered_map与 key_type和 mapped_type倒。下面的函数适用于 std::unorderd_map .我
我是一名优秀的程序员,十分优秀!