小编ehi*_*ird的帖子

重复fmap的乐趣

我在玩弄玩家,我发现了一些有趣的东西:

平凡的,id可以在类型中实例化(a -> b) -> a -> b.

使用我们拥有的列表仿函数fmap :: (a -> b) -> [a] -> [b],它与之相同map.

((->) r)函子(from Control.Monad.Instances)的情况下,fmap是函数组合,所以我们可以实例化fmap fmap fmap :: (a -> b) -> [[a]] -> [[b]],这相当于(map . map).

有趣的是,fmap八次给我们(map . map . map)!

所以我们有

0: id = id
1: fmap = map
3: fmap fmap fmap = (map . map)
8: fmap fmap fmap fmap …
Run Code Online (Sandbox Code Playgroud)

haskell functor

54
推荐指数
1
解决办法
1804
查看次数

编译器是否可以自动检测纯函数而无需关于纯度的类型信息?

所以我和我的朋友争论说,像GCC这样的编译器可以在没有任何类型信息的情况下自动检测纯函数.我不信.

像D或Haskell这样的语言在其类型系统中具有纯度,程序员明确定义了哪些函数是纯粹的还是纯粹的.纯函数没有副作用,因此可以非常容易地并行化.

所以问题是:这一切都是必要的吗?编译器可以检测纯度,而不需要任何元或类型信息,只需假设任何执行IO或自动访问全局变量的东西都不纯粹吗?

c compiler-construction gcc haskell d

38
推荐指数
2
解决办法
2662
查看次数

如何访问用户定义的Xcode构建设置?

如果我在构建配置中添加了用户定义的设置,我如何在Objective-C代码中读取该设置?

我的项目中有两个文件,debug.plist并且release.plist.我希望我MainApp.m的文件根据正在运行的构建配置读取其中一个文件.我在Debug和Release配置中设置了一个名为"filename"的用户定义设置,指向相应的文件.但我不知道我的MainApp.m文件如何从当前运行的配置中读取filename变量.

xcode objective-c

34
推荐指数
5
解决办法
4万
查看次数

在Haskell中使用什么而不是主循环?

我需要main在Haskell中使用循环.我试过这个:

main :: IO ()
main =
  do
    putStrLn "do something"
    main
Run Code Online (Sandbox Code Playgroud)

上面的代码是正确的方法吗?这种无限递归会导致溢出吗?

haskell

29
推荐指数
1
解决办法
4399
查看次数

通过具有不同参数数量的方程定义函数

我今天注意到这样一个定义

safeDivide x 0 = x
safeDivide = (/)
Run Code Online (Sandbox Code Playgroud)

不可能.我很好奇这背后的(好)原因是什么.必须有一个非常好的(毕竟它是Haskell :)).

注意:我不是在寻找上面代码的替代实现的建议,这是一个简单的例子来证明我的观点.

haskell

26
推荐指数
3
解决办法
3012
查看次数

为什么在where子句中使用类型签名如此罕见?

它是否有助于编译器进行优化,或者仅仅是添加其他类型签名的剩余工作?例如,人们经常看到:

foo :: a -> b
foo x = bar x
      where bar x = undefined
Run Code Online (Sandbox Code Playgroud)

而不是:

foo :: a -> b
foo x = bar x
      where bar :: a -> b
            bar x = undefined
Run Code Online (Sandbox Code Playgroud)

如果我省略顶级类型签名,GHC会给我一个警告,所以如果我没有收到警告,我相信我的程序是正确的.但是如果省略where子句中的签名,则不会发出警告.

haskell where-clause type-signature

20
推荐指数
3
解决办法
2236
查看次数

为什么没有数据构造函数的类型有效?

这似乎是合法的:

data MagazineInfo = Int String
    deriving (Show)
Run Code Online (Sandbox Code Playgroud)

我不确定是否有默认数据构造函数,但上面的代码编译.

为什么上面有效的Haskell,因为我没有明确指定值构造函数?

haskell

18
推荐指数
1
解决办法
652
查看次数

在FRP中应用行为(和其他类型)的位置

我正在研究一个使用反应性香蕉的程序,我想知道如何使用基本的FRP构建块来构建我的类型.

例如,这是我真实程序的一个简化示例:假设我的系统主要由小部件组成- 在我的程序中,随着时间的推移而变化的文本片段.

我本可以有

newtype Widget = Widget { widgetText :: Behavior String }
Run Code Online (Sandbox Code Playgroud)

但我也可以

newtype Widget = Widget { widgetText :: String }
Run Code Online (Sandbox Code Playgroud)

并使用Behavior Widget时,我想谈谈随时间变化的行为.这似乎使事情"更简单",并且意味着我可以Behavior更直接地使用操作,而不是必须解压缩和重新打包Widgets来执行它.

另一方面,前者似乎避免了实际定义小部件的代码中的重复,因为几乎所有的小部件都会随着时间的推移而变化,我发现自己甚至定义了几个没有的小部件Behavior,因为它让我可以将它们与其他人以更一致的方式.

作为另一个例子,使用两种表示形式,有一个Monoid实例是有意义的(我希望在我的程序中有一个实例),但后者的实现似乎更自然(因为它只是将列表monoid轻微提升到newtype ).

(我的实际程序使用Discrete而不是Behavior,但我不认为这是相关的.)

同样,我应该使用Behavior (Coord,Coord)还是(Behavior Coord, Behavior Coord)表示2D点?在这种情况下,前者似乎是明显的选择; 但是当它是一个代表游戏中某个实体之类的五元素记录时,选择似乎不太清楚.

从本质上讲,所有这些问题都归结为:

使用FRP时,我应该在哪个层使用该Behavior类型?

(同样的问题也适用Event,尽管程度较轻.)

haskell frp reactive-programming

17
推荐指数
2
解决办法
467
查看次数

Haddock模块如何使用Portability,Stability和Maintainer?

在许多Haddock生成的模块文档(例如Prelude)中,可以看到右上角的一个小框,包含可移植性,稳定性和维护者信息:

示例包信息框

从查看源代码到这些模块和实验,我确认此信息是从模块描述中的以下行生成的:

-- Maintainer  :  libraries@haskell.org
-- Stability   :  stable
-- Portability :  portable
Run Code Online (Sandbox Code Playgroud)

这有几个奇怪的事情:

  • 这些字段似乎按此顺序工作 - 任何按顺序排列的字段都只是作为模块描述本身的一部分.尽管源文件中的顺序与生成的文档中的顺序相反,但这是事实!

  • 我一直无法找到这些字段的任何官方文档.有一个名为Cabal包的属性stability,其示例值与我在等效的Haddock字段中看到的值相匹配,但除此之外,我什么也没找到.

那么:这些字段是如何使用的,是否可以在任何地方记录?

特别是,我想知道:

  • 对于常用值的完整列表PortabilityStability.这个HaskellWiki页面有一个列表,但我想知道这个列表的起源.

  • 决定模块是便携式还是非便携式的标准.特别是,我希望这些问题的答案,acme-strfry,是一个FFI绑定strfry,一个只在glibc中可用的函数.包是不可移植的,因为它只适用于glibc系统或可移植,因为它不使用任何Haskell语言扩展?常见的用法似乎意味着后者.

  • 为什么源文件中需要特定的字段顺序,以及为什么它与生成的文档中的顺序相反.

haskell haddock

16
推荐指数
1
解决办法
719
查看次数

衍生塔以及如何使用矢量空间包(haskell)

我现在和Haskell合作已经有一段时间了,但我远非专家.但我发现编程的功能方法最适合我.

到目前为止,我正在研究一个项目来计算一些严重的东西,比如给定结构辐射的电流和电位.

我跟着Conal Elliott写的博客(这里是一些更多的线性地图),这是非常好的和基础的.

不幸的是,我缺少一个简单的例子:)

更确切地说,我有一条曲线

f:[0,1] in R -> R³
t -> a*e_y + 2*t*e_z
Run Code Online (Sandbox Code Playgroud)

这是(0,a,2*t)处的简单直线.当我想计算f的导数,例如用于曲线的长度,我知道数学结果,这是很简单的(0,0,2),但我要如何做到这一点在Haskell,尤其是与病媒太空包?

我真的很想使用这个库,因为它的功能,这正是我所采取的方法(但我在Haskell之路上并没有那么遥远)

到目前为止我所拥有的是:

{-# LANGUAGE Rank2Types, TypeOperators, FlexibleContexts, TypeFamilies #-}
{-# OPTIONS_GHC -Wall #-}
import Numeric.GSL.Integration
import Data.VectorSpace
import Data.Basis
import Data.Cross
import Data.Derivative
import Data.LinearMap

type Vec3 s = Three s

prec :: Double
prec = 1E-9

f1 :: (Floating s, VectorSpace s, Scalar s ~ s) => s -> s
f1 = id

c1 :: Double …
Run Code Online (Sandbox Code Playgroud)

haskell

14
推荐指数
1
解决办法
831
查看次数