小编Und*_*ren的帖子

seq功能和严格性

我一直在想这个,但我一直无法找到它.

使用该seq功能时,它如何真正起作用的?在任何地方,只是解释说seq a b评估a,丢弃结果并返回b.

但是,是什么真正意味着什么?以下结果将严格评估:

foo s t = seq q (bar q t) where
      q = s*t
Run Code Online (Sandbox Code Playgroud)

我的意思是,q在使用之前是否经过严格评估bar?以下是相同的:

foo s t = seq (s*t) (bar (s*t) t)
Run Code Online (Sandbox Code Playgroud)

我觉得有点难以详细说明这个功能的功能.

haskell strict

40
推荐指数
2
解决办法
6047
查看次数

用符号表示"< - "绑定

我很难理解这一点.写入符号时,以下两行有何不同?

1. let x = expression
2. x <- expression
Run Code Online (Sandbox Code Playgroud)

我看不出来.有时一个工作,有时一个工作.但两者都很少."了解你是一个哈克尔"说,<-右侧将符号绑定在左侧的符号上.但这与简单定义xlet什么不同?

binding haskell

22
推荐指数
3
解决办法
4161
查看次数

(++)与懒惰评估的表现

我一直在想这个问题,但我找不到令人满意的答案.

为什么(++)"贵"?在惰性评估下,我们不会评估像这样的表达式

xs ++ ys
Run Code Online (Sandbox Code Playgroud)

在必要之前,即便如此,我们只会在需要评估我们需要的部分.

有人可以解释我错过的东西吗?

haskell concatenation lazy-evaluation

16
推荐指数
2
解决办法
633
查看次数

"句柄"功能和真实世界Haskell

我正在读RWH,我来到第9章.它介绍了以下代码:

import System.IO
import Control.Exception

saferFileSize :: FilePath -> IO (Maybe Integer)
saferFileSize path = handle (\_ -> return Nothing) $ do
  h <- openFile path ReadMode
  size <- hFileSize h
  hClose h
  return (Just size)
Run Code Online (Sandbox Code Playgroud)

但它不会编译,给出以下错误消息:

test.hs:5:22:
    Ambiguous type variable `e0' in the constraint:
      (Exception e0) arising from a use of `handle'
    Probable fix: add a type signature that fixes these type variable(s)
    In the expression: handle (\ _ -> return Nothing)
    In the expression:
      handle (\ _ -> …
Run Code Online (Sandbox Code Playgroud)

haskell compiler-errors

13
推荐指数
1
解决办法
851
查看次数

州monad和learnyouahaskell.com

我正在阅读关于状态monad的Learn You a Haskell指南,但我无法理解它,因为堆栈示例无法编译.在指南中,他使用了以下代码:

import Control.Monad.State  

type Stack = [Int]

pop :: State Stack Int  
pop = State $ \(x:xs) -> (x,xs)  

push :: Int -> State Stack ()  
push a = State $ \xs -> ((),a:xs) 
Run Code Online (Sandbox Code Playgroud)

虽然我理解它应该做什么,但它不会编译.我不知道为什么.错误消息是:

Stack.hs:6:7: Not in scope: data constructor `State'

Stack.hs:9:10: Not in scope: data constructor `State'
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义,因为据我所知,"State"实际上是一个数据构造函数,定义为

newtype State s a = State { runState :: s -> (a,s) }
Run Code Online (Sandbox Code Playgroud)

指南是"错误的",如果是,我该如何解决?

monads haskell

12
推荐指数
1
解决办法
2532
查看次数

在haskell中创建类似网格的数据类型

问题

我一直在想如何在一段时间内有效地完成这项任务,但由于某种原因,我无法做到这一点.我需要建模一个矩形网格,其中每个字段包含一些数据.

我需要通过拉链访问它,我的焦点是一个字段(值可以这么说).拉链应该支持的动作goDown,goUp,goLeftgoRight,每个改变聚焦到字段中所指示的方向,以及here,其中应目前正在焦点返回字段的值.

虽然这可以用a来完成Map,但是在某种意义上,由于具有对数查找时间,因此改变焦点需要花费log n时间,n即元素的数量,这是低效的.MapMap

我需要指示的行动及时发挥作用O(1).

为了便于说明,请查看下面的矩阵.带括号的数字是当前焦点.

1 (2) 3
4  5  6
7  8  9
Run Code Online (Sandbox Code Playgroud)

如果我申请goRight,我应该得到:

1  2 (3)
4  5  6
7  8  9
Run Code Online (Sandbox Code Playgroud)

如果我here现在申请,返回的值应该是3.

如上所述的表单上的数据类型如何在haskell中查找?它是否可以作为代数数据类型实现?

请记住,在所有四个方向上的焦点变化应该是O(1)及时的,以及读取当前焦点的值.

lookup haskell zipper algebraic-data-types

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

求解最短哈密顿路径的扩展

我正在考虑对最短哈密顿路径(SHP)问题的扩展,我找不到解决它的方法.我知道它是NP完全的,但我想我会在这里提出想法,因为我不想简单地强行解决问题.

扩展非常简单:给定具有n个顶点的无向完整加权图,找到具有端点vu的最短哈密顿路径.

因此,bruteforce仍然需要O(n!)时间,因为剩余的n -2个顶点可以在(n -2)中访问!方法.我试图找到一种方法,也许解决这个快.到目前为止,我努力寻找以有益的方式解决这个问题的方法.

有人会想知道如何利用终点顶点的知识吗?优选地与一些伪代码一起解释.找到的解决方案是最佳的.

我想它可以通过整数编程来解决,因为终端节点的知识是相当有限的,并且很容易避免循环,但它不会真正利用问题的组成.

graph pseudocode np-complete shortest-path

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

在Haskell中修改数组并记住索引

我需要对子数组进行转换,并且可能需要在子数组的子数组上进行转换,依此类推.

是否有直观的方法在Haskell中执行此操作,例如定义子数组或类似的东西?我在"对haskell的一个温和的介绍"中阅读了关于数组的部分,并没有解决它,我很难找到一种方法来实现它.

这对匈牙利算法的实现所描述这里的维基百科.

所以到目前为止我做了以下事情:

import Array

step1 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a
step1 a      = a // [ ((i,j), f (i,j) ) | (i,j) <- range (bounds a) ] where
    f (i,j)  = a!(i,j) - minRow i
    minRow i = minimum [ a!(i,j) | j <- [1..(snd . snd . bounds) a] ]

step2 :: (Ord a , Num a) => Array (Int,Int) a -> Array (Int,Int) a
step2 …
Run Code Online (Sandbox Code Playgroud)

arrays haskell

7
推荐指数
1
解决办法
307
查看次数

haskell中构造函数的内存使用情况

可能重复:
Haskell数据类型的内存占用量

在解决组合问题时,我经常将解决方案表示为一个字符串,例如.1010100010110111000110 ...你明白了.

我认为当我使用[Int]比特串时,Int总是花费相同数量的内存,无论实际数量有多大(因为Int它是有界的,相反Integer),因为计算机只记得比特表示,而且String会据我所知,占据更多空间.

我的想法是使用数据类型

data Bits = Empty | Zero Bits | One Bits deriving (Eq,Ord,Show)
Run Code Online (Sandbox Code Playgroud)

但多少内存的构造Empty,ZeroOne用比较Int的?

memory haskell

7
推荐指数
1
解决办法
371
查看次数

"< - "和相关值

说我写了以下amazin代码:

func = do
  a <- Just 5
  return a
Run Code Online (Sandbox Code Playgroud)

我知道,这是毫无意义的.在这里,a5,并func返回Just 5.

现在我重写了我很棒的(但没有意义的)功能:

func' = do
  a <- Nothing
  return a
Run Code Online (Sandbox Code Playgroud)

这个函数返回了Nothing,但到底是a什么?没有什么可以从一个Nothing值中提取,但是当我做这样的事情时,程序不会抱怨:

func'' = do
  a <- Nothing
  b <- Just 5
  return $ a+b
Run Code Online (Sandbox Code Playgroud)

我只是很难看到实际发生的事情.什么是a?换句话说:<- 实际上做了什么?说它"从右侧提取值并将其绑定到左侧"显然过度简化了它.什么是我没有得到的?

谢谢 :)

monads haskell

6
推荐指数
3
解决办法
264
查看次数