我一直在想这个,但我一直无法找到它.
使用该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)
我觉得有点难以详细说明这个功能的功能.
我很难理解这一点.写入符号时,以下两行有何不同?
1. let x = expression
2. x <- expression
Run Code Online (Sandbox Code Playgroud)
我看不出来.有时一个工作,有时一个工作.但两者都很少."了解你是一个哈克尔"说,<-右侧将符号绑定在左侧的符号上.但这与简单定义x有let什么不同?
我一直在想这个问题,但我找不到令人满意的答案.
为什么(++)"贵"?在惰性评估下,我们不会评估像这样的表达式
xs ++ ys
Run Code Online (Sandbox Code Playgroud)
在必要之前,即便如此,我们只会在需要时评估我们需要的部分.
有人可以解释我错过的东西吗?
我正在读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) 我正在阅读关于状态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)
指南是"错误的",如果是,我该如何解决?
我一直在想如何在一段时间内有效地完成这项任务,但由于某种原因,我无法做到这一点.我需要建模一个矩形网格,其中每个字段包含一些数据.
我需要通过拉链访问它,我的焦点是一个字段(值可以这么说).拉链应该支持的动作goDown,goUp,goLeft和goRight,每个改变聚焦到字段中所指示的方向,以及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)及时的,以及读取当前焦点的值.
我正在考虑对最短哈密顿路径(SHP)问题的扩展,我找不到解决它的方法.我知道它是NP完全的,但我想我会在这里提出想法,因为我不想简单地强行解决问题.
扩展非常简单:给定具有n个顶点的无向完整加权图,找到具有端点v和u的最短哈密顿路径.
因此,bruteforce仍然需要O(n!)时间,因为剩余的n -2个顶点可以在(n -2)中访问!方法.我试图找到一种方法,也许解决这个稍快.到目前为止,我努力寻找以有益的方式解决这个问题的方法.
有人会想知道如何利用终点顶点的知识吗?优选地与一些伪代码一起解释.找到的解决方案是最佳的.
我想它可以通过整数编程来解决,因为终端节点的知识是相当有限的,并且很容易避免循环,但它不会真正利用问题的组成.
我需要对子数组进行转换,并且可能需要在子数组的子数组上进行转换,依此类推.
是否有直观的方法在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) 可能重复:
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,Zero并One用比较Int的?
说我写了以下amazin代码:
func = do
a <- Just 5
return a
Run Code Online (Sandbox Code Playgroud)
我知道,这是毫无意义的.在这里,a是5,并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?换句话说:<- 实际上做了什么?说它"从右侧提取值并将其绑定到左侧"显然过度简化了它.什么是我没有得到的?
谢谢 :)