相关疑难解决方法(0)

类型检查器允许非常错误的类型替换,程序仍然编译

在尝试调试我的程序中的问题时(使用Gloss将2个具有相同半径的圆圈绘制成不同的大小),我偶然发现了一个奇怪的情况.在我处理对象的文件中,我有以下定义*:

type Coord = (Float,Float)
data Obj =  Player  { oPos :: Coord, oDims :: Coord }
Run Code Online (Sandbox Code Playgroud)

在导入Objects.hs的主文件中,我有以下定义:

startPlayer :: Obj
startPlayer = Player (0,0) 10
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为我为玩家添加和更改字段,并且忘记更新Player之后(其尺寸由单个数字确定以表示半径,但我将其更改为a startPlayer来表示(宽度,高度);如果我做的话玩家对象是一个非圆圈).

令人惊奇的是,上面的代码编译并运行,尽管第二个字段是错误的类型.

我首先想到的可能是我打开了不同版本的文件,但对编译程序中的任何文件的任何更改都会反映出来.

接下来我认为可能Coord由于某种原因没有被使用.注释会startPlayer产生编译器错误,甚至更奇怪的是,更改startPlayerin 10会导致适当的响应(更改起始大小startPlayer); 再次,尽管它是错误的类型.为了确保它正确读取数据定义,我在文件中插入了一个拼写错误,它给了我一个错误; 所以我正在查看正确的文件.

我试图粘贴2段以上的到自己的文件,并吐出预期误差的第二场PlayerPlayer是不正确.

什么可能允许这种情况发生?您认为这是Haskell的类型检查器应该阻止的事情.


我应该注意到,我原来的问题的答案,即两个被认为是相同半径的圆被绘制成不同的大小,其中一个半径实际上是负的.

haskell types

98
推荐指数
2
解决办法
3569
查看次数

什么(f.).在Haskell中意味着什么?

我已经看到很多函数是根据模式定义的(f .) . g.例如:

countWhere = (length .) . filter
duplicate  = (concat .) . replicate
concatMap  = (concat .) . map
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

haskell functional-programming pointfree function-composition tacit-programming

49
推荐指数
2
解决办法
3709
查看次数

fmap fmap 如何应用于函数(作为参数)?

我试图了解如何fmap fmap适用于 say 之类的函数(*3)

的类型fmap fmap

(fmap fmap):: (Functor f1, Functor f) => f (a -> b) -> f (f1 a -> f1 b)
Run Code Online (Sandbox Code Playgroud)

类型(*3)

(*3) :: Num a => a -> a
Run Code Online (Sandbox Code Playgroud)

这意味着签名a -> a对应于f (a -> b),对吗?

Prelude> :t (fmap fmap (*3))
(fmap fmap (*3)):: (Num (a -> b), Functor f) => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个简单的测试:

test :: (Functor f) …
Run Code Online (Sandbox Code Playgroud)

haskell types function functor function-composition

4
推荐指数
1
解决办法
572
查看次数

理解`flip($)`的类型

综观类型($)flip:

ghci> :t ($)
($) :: (a -> b) -> a -> b

ghci> :t flip
flip :: (a -> b -> c) -> b -> a -> c
Run Code Online (Sandbox Code Playgroud)

你能告诉我flip ($)这样的签名怎么样?

ghci> :t flip ($)
flip ($) :: b -> (b -> c) -> c
Run Code Online (Sandbox Code Playgroud)

haskell

2
推荐指数
1
解决办法
162
查看次数

在Haskell中生成无限列表

所以,为了准备即将到来的考试,我一直在考试一些旧考试,并遇到了这个问题:

编写Haskell代码以定义ints :: [Int]以下形式的无限列表: [0, 1, -1, 2, -2, 3, -3, 4, -4..]

过去半个小时我一直在插电,但似乎无法找到任何解决方案,或者那样做我想做的事情.我觉得我真正想要的是对表单的列表理解

ints :: [Int]
ints = [0] ++ [x (-x) | x <- [1..]]
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我不确定如何让它工作

haskell list-comprehension

0
推荐指数
1
解决办法
218
查看次数