相关疑难解决方法(0)

你如何在Haskell中表示图形?

使用代数数据类型表示haskell中的树或列表很容易.但是你会怎么用印刷术来表示图形呢?看来你需要有指针.我猜你可以有类似的东西

type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours
Run Code Online (Sandbox Code Playgroud)

这是可行的.然而感觉有点脱钩; 结构中不同节点之间的链接并不真正"感觉"像列表中当前上一个和下一个元素之间的链接一样,或者树中节点的父节点和子节点之间的链接.我有一种预感,即在我定义的图形上进行代数操作会受到通过标签系统引入的间接级别的阻碍.

主要是这种怀疑的感觉和不雅的感觉使我提出这个问题.在Haskell中定义图形是否有更好/更优化的方式?或者我偶然发现了本质上坚硬/根本的东西?递归数据结构很好,但这似乎是另一回事.自引用数据结构,与树和列表的自引用方式不同.它就像列表和树在类型级别是自引用的,但是图形在值级别是自引用的.

那真正发生了什么?

haskell types functional-programming graph algebraic-data-types

118
推荐指数
7
解决办法
3万
查看次数

是否有可能在Haskell中检测共享?

在Scheme中,原语eq?测试其参数是否是同一个对象.例如,在以下列表中

(define lst
  (let (x (list 'a 'b))
    (cons x x)))
Run Code Online (Sandbox Code Playgroud)

的结果

(eq? (car x) (cdr x))
Run Code Online (Sandbox Code Playgroud)

是真实的,而且它是真实的,而不具有窥视(car x)和(cdr x).这允许您为具有大量共享的数据结构编写有效的相等性测试.

在Haskell中是否可以做同样的事情?例如,请考虑以下二叉树实现

data Tree a = Tip | Bin a (Tree a) (Tree a)

left  (Bin _ l _) = l
right (Bin _ _ r) = r

mkTree n :: Int -> Tree Int
mkTree 0 = Tip
mkTree n = let t = mkTree (n-1) in Bin n t t
Run Code Online (Sandbox Code Playgroud)

在每个级别都有共享.如果我创建一棵树 …

haskell functional-programming

11
推荐指数
2
解决办法
530
查看次数

如何在Haskell中建模mixins /多个接口?

我在Haskell中遇到了关于建模继承的这个问题,它提醒我,我有一个更复杂的版本同样的问题.我将从那里采用这个例子,因为它比思考我自己更容易.

假设您的程序包含多种类型:

data Camera = Camera ...
data Light = SpotLight ... | DirectionalLight ...
data Object = Monster ... | Player ... | NPC ...
Run Code Online (Sandbox Code Playgroud)

现在你想要实现一些基本的物理,所以你希望它们都具有位置和速度,比如某种类型Vec3.

执行此操作的一种方法是Physical使用pos和vel函数声明类型类,并为其创建所有类型的实例.但这意味着你必须修改所有类型以包含两个Vec3s,如果你已经定义了很多很好的类型,那么这很烦人,而你只想在顶部粘合一些功能.Chris Taylor提出的基于镜头的解决方案也有同样的问题.

一个对我来说更整洁的解决方案是声明一个新类型的构造函数,

data Physical a = Physical a Vec3 Vec3
Run Code Online (Sandbox Code Playgroud)

然后你只需要执行pos,vel以及Functor实例一次,你得到所有现有的类型声明.

但是......这并不是很好.如果您现在希望能够将对象绘制为蓝色或绿色或紫色,则可能需要使用颜色执行相同操作:

data Coloured a = Coloured a Colour
Run Code Online (Sandbox Code Playgroud)

但是现在,如果你有一个Coloured Physical Camera,你必须fmap一个不同的次数取决于您是否想看看它的颜色和它的位置,或者它的焦距.和a Coloured Physical Camera应该是一样的Physical Coloured …

code-reuse haskell mixins

10
推荐指数
1
解决办法
655
查看次数

FRP中的"行为现在"

在之前的SO问题中(是否可能?:行为t [行为ta] - >行为t [a])我们正在分析a Behavior join(使用reactive-banana术语)的存在.

Behavior t (Behavior t a) -> Behavior t a
Run Code Online (Sandbox Code Playgroud)

在语义模型中实现如下

type Behavior t a = t -> a

behaviorNow :: Behavior t (Behavior t a) -> Behavior t a
behaviorNow f t = f t t
Run Code Online (Sandbox Code Playgroud)

虽然实施这一直接将是不幸的,因为我们可以生产Behavior Monad使用const及behaviorNow,是否以及如何不behaviorNow违反FRP的语义?

我很乐意使用任何其他FRP系统的术语来听取答案,如果有意义的话,还要进行比较.

haskell frp reactive-banana netwire

9
推荐指数
2
解决办法
373
查看次数

相同数据的多个查找结构:内存重复?

假设我有很多人的数据,我希望能够以不同的方式查找它们.也许有某种数据结构(如二叉树)有助于按名称查找.也许还有另一个(如列表)按创作顺序排列.也许还有更多.

在许多语言中,您可以让每个人在堆上分配一次.每个数据结构都包含指向该内存的指针.因此,每次添加新的查找方式时,您都不会分配一组新人.

在哈斯克尔怎么样?当不同的数据结构需要索引相同的数据时,有没有办法避免内存重复?

haskell

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

Is it possible?: Behavior t [Behavior t a] -> Behavior t [a]

Is there a way to have a Behavior t [a] where the values of [a] at time t are the values contained in a Behavior t [Behavior t a] at time t? I.e, a function with the type of:

Behavior t [Behavior t a] -> Behavior t [a]
Run Code Online (Sandbox Code Playgroud)

If this is not possible, is that because of a logical impossibility or a limitation in reactive-banana?

haskell frp reactive-banana

3
推荐指数
1
解决办法
205
查看次数

Haskell - 维护全局变量的不同状态

我已经对stackoverflow做了一些研究,以找到维持全局变量的不同状态的常见问题的可行解决方案.

我发现这个复杂的问题解决了类似的问题.它提出了类似神的全局变量的重要问题,这是Haskell中的反模式.我完全理解我的情况是类似的,我正在尝试介绍这个反模式,但我真的不喜欢这个答案.Netwire对于我手边的任务来说,这似乎是一种矫枉过正,它可以以更加简单和优雅的方式完成.

我也找到了这个,但问题和答案都解决了更普遍的问题和方法,而我有具体的问题,希望是具体的解决方案.我想要的(在以前的问题中找不到)是通过简单的例子在理解维持变量状态方面做出定性的步骤.

在下面的代码中,我试图从执行:load和:new命令的两个不同位置更新神似变量的状态,但显然,它不起作用.

我的问题是如何修改以下代码以适应以功能方式更改全局变量值的可能性?我是否应该抛弃所有代码,因为它代表了命令式的方法,并将其全部替换为parseInput遵循功能世界规则的新方法?我应该用其他东西替换全局变量吗?我假设我可以用IORef某种方式,这似乎是合适的.或ST Monad为这个问题/答案建议.

如果没有过度杀伤力,解决这个问题的最简单,最直接的步骤是什么?我知道我可能需要更好地掌握Monads(特别是State Monad)的概念,我准备好了解他们如何帮助解决这个特殊问题.但到目前为止我读过的文章(这个和这个)并没有多大帮助.我假设State Monad不合适,因为我的例子没有返回值,只有更新状态.如果我错了,你能否解释一下如何以及哪些缺失链接可以帮助我更好地理解Haskell中的状态?

{-# LANGUAGE QuasiQuotes #-}

import Text.Regex.PCRE
import System.Console.Haskeline
import TH (litFile)
import System.FilePath
import System.IO
import Control.Monad
import Control.Monad.IO.Class
import Data.List 

mydata :: [Int]
mydata = [0]

saveDataToFile :: [Int] -> IO ()
saveDataToFile mydata = withFile "data.txt" WriteMode $ \h -> System.IO.hPutStr h (unwords $ map show mydata) …
Run Code Online (Sandbox Code Playgroud)

io state haskell

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