小编Jam*_*ham的帖子

在Scala中压缩任意嵌套集合的通用,类型安全方法?

有时候我会花一些时间和Scala一起玩,虽然在我自己的工作中无法使用Scala,但它的功能组合对我很有吸引力(到目前为止).对于踢,我决定以最通用的方式尝试前几个99 Haskell问题 - 操作并返回任何类型的适用集合.前几个问题并不太难,但我发现自己完全陷入了困境flatten.我只是无法弄清楚如何输入这样的东西.

具体来说我的问题是:是否有可能编写一个类型安全的函数来展平任意嵌套的SeqLikes?那么,比方说,

flatten(List(Array(List(1, 2, 3), List(4, 5, 6)), Array(List(7, 8, 9), List(10, 11, 12))))
Run Code Online (Sandbox Code Playgroud)

会回来的

List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12): List[Int]
Run Code Online (Sandbox Code Playgroud)

?请注意,这与Haskell和Scala问题集中的问题不完全相同; 我正在尝试编写一个函数来展平异构列表,而不是同构但嵌套的序列.

在网上搜索我找到了该问题的Scala翻译,但它运行并返回List [Any].我是否正确,这将需要某种类型的递归?或者我这样做是否比它更难?

scala scala-collections

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

懒惰列表根据其类型的具体性重建?

我在Haskell中编写了一个简单(且非严重)的素数生成器,它具有相互递归的定义,用于生成素数和确定数字的素数:

primes :: (Integral a) => [a]
primes = 2 : filter isPrime [3, 5..]

isPrime :: (Integral a) => a -> Bool
isPrime m = all (indiv m) (takeWhile (<= (intSqrt m)) primes)

intSqrt :: (Integral a) => a -> a
intSqrt 1 = 1
intSqrt n = div (m + (div (n - 1) m)) 2
  where m = intSqrt (n - 1)

indiv :: (Integral a) => a -> a -> Bool
indiv m n = rem …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation typeclass monomorphism-restriction

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

使用 POSIX 共享内存和信号量以块的形式传输文件

全面披露:虽然这不是针对课程的,但它是一个简化的示例,涉及我之前的作业(现已通过)中遇到的问题。

考虑使用 POSIX 共享内存在两个进程之间传输文件。生产者进程共享从文件中读取的内容,并将其按块写入共享内存区域;消费者进程从该区域读取一大块字节并将其写出(例如写入文件)。起初,我尝试了一种简单的同步方法 - 只是锁定对信号量中共享内存的访问 - 但当然,这允许单个写入/读取的多个读取/写入。

我想我已经找到了一种方法来做到这一点,即使用第二个共享内存区域,根据其当前值阻止对读取器或写入器的访问。然后,用伪代码:

before request begins:
    initialize shared memory region SHM
    initialize synchronization region SHM2 = "0"
    initialize sem

consumer:
    loop until total bytes read = file length:
        while (SHM2 == "0" [lock access to SHM2 while checking]):
            wait

        read N bytes from SHM
        write N bytes to file

        sem_wait(sem)
        set SHM2 = "0"
        sem_post(sem)

producer:
    loop until total bytes written = file length:
        while (SHM2 == "1" [lock access to SHM2 while checking]): …
Run Code Online (Sandbox Code Playgroud)

c semaphore pseudocode shared-memory multiprocessing

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

Monad的Num实例; 只有在看似无关的代码存在的情况下重叠实例?

如果我可以将Monads视为Nums(当然适用的话),我会有一些代码更清晰.足够轻松完成:

{-# LANGUAGE FlexibleInstances #-}

import Control.Monad (liftM, liftM2)
import Data.Char (digitToInt)

instance (Monad m, Num a) => Num (m a) where
  (+) = liftM2 (+)
  (-) = liftM2 (-)
  (*) = liftM2 (*)
  abs = liftM abs
  signum = liftM signum
  fromInteger = return . fromInteger

square :: (Monad m, Num a) => m a -> m a
square x = x * x

-- Prints "Just 9", as expected
main = putStrLn $ show …
Run Code Online (Sandbox Code Playgroud)

haskell overlapping-instances

0
推荐指数
1
解决办法
294
查看次数