gpt4 book ai didi

haskell - 使用 Char 在没有 FlexibleContexts 的情况下无法编译

转载 作者:行者123 更新时间:2023-12-04 17:16:48 28 4
gpt4 key购买 nike

sierpinski :: Int -> Array (Int,Int) Char
sierpinski l = runSTArray $ do
arr <- newArray ((1,1),(63,32)) '_'
let drawLine x y len = forM_ [-len..len] $ \s -> writeArray arr (x+s,y-len) '1' --this part does not compile without FlexibleContexts \\* Non type-variable argument in the constraint: MArray a0 Char m (Use FlexibleContexts to permit this)
let rek n x y h | n == 0 = forM_ [0..h-1] (drawLine x y)
| otherwise = do
rek (n-1) x y (div h 2)
rek (n-1) (x + div h 2) (y - div h 2) (div h 2)
rek (n-1) (x - div h 2) (y - div h 2) (div h 2)
rek l 32 32 32
return arr

但是将数组类型从 Char 更改为 Int 是可以的
sierpinski :: Int -> Array (Int,Int) Int
sierpinski l = runSTArray $ do
arr <- newArray ((1,1),(63,32)) 0
let drawLine x y len = forM_ [-len..len] $ \s -> writeArray arr (x+s,y-len) 1 --now ok
let rek n x y h | n == 0 = forM_ [0..h-1] (drawLine x y)
| otherwise = do
rek (n-1) x y (div h 2)
rek (n-1) (x + div h 2) (y - div h 2) (div h 2)
rek (n-1) (x - div h 2) (y - div h 2) (div h 2)
rek l 32 32 32
return arr

有人可以澄清为什么会这样吗?

谢谢。

最佳答案

原因实际上在错误消息中。

Non type-variable argument in the constraint: 
MArray a0 Char m (Use FlexibleContexts to permit this)

当你使用文字 '_''1' , Haskell 推断它们的类型是 Char ,然后它会遇到最典型的问题,即 MultiParamTypeClasses 的约束。 - 约束参数并不都是类型变量,但这正是 Haskell 报告所要求的。 Haskell 想要推断的签名类似于
drawLine :: MArray a Char m => ...

MultiParamTypeClasses 之前这不是问题因为之前的所有类(class)都只有一个论点。然后,如果该参数不是类型变量,您所要做的就是检查该实例是否可派生,如果它是类型变量,则将其保留为约束。与 MultiParamTypeClasses您经常会遇到中间情况 - 一些参数被实例化,有些则没有。 FlexibleContexts 让您拥有这种混合物(甚至更多)。这是一个安全的扩展(我很乐意看到它成为 Haskell 2020 的一部分)。

但是 Int 呢? ?为什么它不给我同样的错误?

它实际上不是直接关于 Int .当 Haskell 看到文字 01 ,由于数字文字被重载,它只决定一个通用类型: Num a => a .这意味着 Haskell 推断的约束只是
drawLine :: (Num n, MArray a n m) => ...

这甚至不需要 FlexibleInstances因为所有约束都有类型变量的参数。

关于haskell - 使用 Char 在没有 FlexibleContexts 的情况下无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39033380/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com