在尝试调试我的程序中的问题时(使用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段以上的到自己的文件,并吐出预期误差的第二场Player中Player是不正确.
什么可能允许这种情况发生?您认为这是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
我试图了解如何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) 综观类型($)和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代码以定义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)
但这不起作用,我不确定如何让它工作