- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
注意:完整源代码在这里:https://gist.github.com/anonymous/7085509
我有以下功能:
tournament n p pop = do
winner <- (\w -> min (n - 1) (floor (log w / log (1-p)))) <$> gaRandom
(flip S.index) winner <$> S.sort <$> seqChoose n pop
如果没有类型签名,编译器会告诉我锦标赛
签名是:
tournament
:: (Floating a, Ord a1, RealFrac a, Random a) =>
Int -> a -> S.Seq a1 -> StateT GA Data.Functor.Identity.Identity a1
这对我来说看起来不错。但当我使用它时:
t2 = do
g <- newStdGen
let a = evalState (tournament 5 0.9 (S.fromList [1..10])) (GA g)
return ()
我收到错误:
GA.hs:85:37:
No instance for (Fractional a0) arising from the literal `0.9'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Fractional Double -- Defined in `GHC.Float'
instance Fractional Float -- Defined in `GHC.Float'
instance Integral a => Fractional (GHC.Real.Ratio a)
-- Defined in `GHC.Real'
...plus three others
In the second argument of `tournament', namely `0.9'
In the first argument of `evalState', namely
`(tournament 5 0.9 (S.fromList [1 .. 10]))'
In the expression:
evalState (tournament 5 0.9 (S.fromList [1 .. 10])) (GA g)
这引出了我的第一个问题,为什么RealFrac
不暗示Fractional
?类型签名具有 RealFrac,但错误提示缺少 Fractional 实例。
其次,我将类型签名复制并粘贴回代码中,并添加小数 a
:
tournament
:: (Floating a, Ord a1, RealFrac a, Fractional a, Random a) =>
Int -> a -> S.Seq a1 -> State GA a1
tournament n p pop = do
winner <- (\w -> min (n - 1) (floor (log w / log (1-p)))) <$> gaRandom
(flip S.index) winner <$> S.sort <$> seqChoose n pop
现在我得到的错误是:
GA.hs:88:24:
No instance for (Random a0) arising from a use of `tournament'
The type variable `a0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Random Bool -- Defined in `System.Random'
instance Random Foreign.C.Types.CChar -- Defined in `System.Random'
instance Random Foreign.C.Types.CDouble
-- Defined in `System.Random'
...plus 33 others
In the first argument of `evalState', namely
`(tournament 5 0.9 (S.fromList [1 .. 10]))'
In the expression:
evalState (tournament 5 0.9 (S.fromList [1 .. 10])) (GA g)
In an equation for `a':
a = evalState (tournament 5 0.9 (S.fromList [1 .. 10])) (GA g)
现在这让我更加困惑,因为我没有类型变量a0
。 这引出了我的第二个问题:显然我误解了一些东西,但是什么?
最佳答案
简而言之,您需要为 0.9
修复具体类型,例如 Double
。您可以使用内联类型注释 (0.9::Double)
来做到这一点。
总而言之:数字文字在 Haskell 中有点奇怪。一般来说,Haskell 需要一种将语法(0
、0.0
、0e0
)投影为语义(Int
、 Integer
、Rational
、Double
),同时尽可能长时间地保持通用性(Num
、Fractional
,RealFrac
)。让我们看看它是如何完成的。
如果您单独键入数字文字,您将获得泛型类型
>>> :t 1
1 :: Num a => a
>>> :t 1.0
1.0 :: Fractional a => a
>>> :t 1e0
1e0 :: Fractional a => a
这意味着我们需要先修复a
的具体实现,然后才能使用它。实际上,这个类型变量a
会被携带
>>> :t [1,2,3]
[1,2,3] :: Num a => [a]
>>> :t [1e0,2,3]
[1e0,2,3] :: Fractional a => [a]
如果有帮助,将语法视为这样翻译会很有用
1 === fromInteger (1 :: Integer) :: Num a => a
1.0 === fromRational (1.0 :: Rational) :: Fractional a => a
但是我们可以在不同的时间消除类型变量
>>> :t show 3
show 3 :: String
当我们从未声明过 3 的类型时,Haskell 如何知道它是什么?如果可能的话,它会默认。特别是,如果你打开 -Wall
你会看到这个
>>> show 1e3
<interactive>:63:6: Warning:
Defaulting the following constraint(s) to type `Double'
(Fractional a0)
arising from the literal `1e3' at <interactive>:63:6-8
(Show a0) arising from a use of `show' at <interactive>:63:1-4
In the first argument of `show', namely `1e3'
In the expression: show 1e3
In an equation for `it': it = show 1e3
"1000.0"
此默认行为is controlled by an almost-never-used pragma default
“默认情况下”是
default (Integer, Double)
其作用为
Each defaultable variable is replaced by the first type in the default list
that is an instance of all the ambiguous variable's classes. It is a static
error if no such type is found.
因此,可能发生的情况是,您将 0.9
限制为 Double
未实例化的某个类。在搜索过程中,Haskell 在找不到 Fractional
类后放弃,并引入了新的 a0
变量来表示这种迄今为止未引用的未知类型的 0.9
.
如一开始所述,您可能需要对 Double
进行内联注释来帮助推理器。可以添加到您的默认
列表中,但这是一个坏主意,因为人们很少使用该功能。
关于Haskell:为什么 RealFrac 不暗示分数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19497940/
我需要在我的网站中实现自动建议功能,并且我需要一些易于开发或编辑的 java 脚本框架或代码,并且自动建议将是多个字段 最佳答案 适配 jQuery:http://jqueryui.com/ 关于ja
在下面的示例中,SonarQube 提示 model.toString() 是 not null 并且 (model == null) 始终 false,需要一些帮助来了解可以采取哪些措施来修复它。因
我正在尝试创建自定义 iOS 键盘。我使用 UILexicon 类来提供 requestSupplementaryLexiconWithCompletion: 方法提供的基本词库。 但我也想将预测文本
如何断言如果 X 为 true 那么 Y 也为 true。问题是,如果我写以下内容: assert(X && Y && "If X is true then Y should be true too.
创建路径中包含两个反斜杠的文件时,是否会产生任何不可预见的后果。 在此代码中,文件创建正常,但我想知道在使用此文件的过程中是否有任何副作用。 HANDLE hFile = CreateFile(
在下面的示例中,SonarQube 提示 bookmark 可能为 null 或为 null,需要一些帮助来了解可以采取哪些措施来修复它。因为 bookmark 在 for 循环中被初始化为变量,并且
这个问题在这里已经有了答案: Partial ordered Comparator (6 个答案) 关闭 8 年前。 我有一组序列化到文件中的项目。有些项目可以依赖其他项目,但不允许循环引用。因此,
我想创建将始终使用 gcc/g++/clang 支持的 C/C++ 标准的“最新”版本的 shell 别名/clang++(C的一个别名,C++的一个别名)。我意识到这可能有多种解释: 最新的 GNU
我是一名优秀的程序员,十分优秀!