小编Ode*_*Wat的帖子

如何将值的类型作为字符串?

我想知道是否可以在运行时从Nim中的值获取类型(int32/float64/string)?

我认为这可以通过"typeinfo"库实现,但我无法理解!

编辑:得到答案,并迅速做到这一点:

import typetraits

type
    MyObject = object
        a, b: int
        s: string

let obj = MyObject(a: 3, b: 4, s: "abc")

proc dump_var[T: object](x: T) =
    echo x.type.name, " ("
    for n, v in fieldPairs(x):
        echo("    ", n, ": ", v.type.name, " = ", v)
    echo ")"

dump_var obj
Run Code Online (Sandbox Code Playgroud)

输出:

MyObject (
    a: int = 3
    b: int = 4
    s: string = abc
)
Run Code Online (Sandbox Code Playgroud)

nim-lang

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

将ISO-8859-1/Latin-1转换为字符串(UTF-8)有哪些选择?

我扫描了Rust文档,以便在字符编码之间进行转换,但没有找到任何内容.我错过了什么?

是否由Rust语言及其标准库支持(直接或间接),甚至计划在不久的将来?

由于其中一个答案表明有一个简单的解决方案,因为u8可以转换为(Unicode)chars.Unicode是ISO-8859-1中代码点的超集,即1:1映射,它编码为UTF-8中的多个字节,这是StringRust 中s 的内部编码.

fn main() {
    println!("{}", 196u8 as char);
    println!("{}", (196u8 as char) as u8);
    println!("{}", 'Ä' as u8);
    println!("{:?}", 'Ä'.to_string().as_bytes());
    println!("{:?}", "Ä".as_bytes());
    println!("{}",'Ä' == 196u8 as char);
}
Run Code Online (Sandbox Code Playgroud)

得到:

Ä
196
196
[195, 132]
[195, 132]
true
Run Code Online (Sandbox Code Playgroud)

哪个我甚至没有考虑过工作!

iso-8859-1 character-encoding rust

6
推荐指数
2
解决办法
2361
查看次数

在Haskell中编号输出行

我想显示具有任意类型的列表的内容,每行一个元素,从1开始编号,如下所示:

字符串示例:

> bs "Hallo"
1. 'H'
2. 'a'
3. 'l'
4. 'l'
5. 'o'
Run Code Online (Sandbox Code Playgroud)

整数示例

> bs [5,6,1,2]
1. 5
2. 6
3. 1
4. 2
Run Code Online (Sandbox Code Playgroud)

元组示例

> bs [(4,"Test"),(3,"Aye"),(5,"Fives")]
1. (4,"Test")
2. (3,"Ayes")
3. (4,"Fives)
Run Code Online (Sandbox Code Playgroud)

我发现这是一个解决方案:

bs' :: Show a => [a] -> Integer -> IO ()
bs' [] _ = return ()
bs' (x:xs) y = do
  putStrLn  $ (show y) ++ ". " ++ (show x)
  bs' xs $ succ y

bs x = bs' x …
Run Code Online (Sandbox Code Playgroud)

haskell

5
推荐指数
2
解决办法
738
查看次数

Haskell函数类型声明中有关括号的详细信息

我目前正在阅读有关身份Monad的文章,其中一篇将fmap定义为:

fmap :: (a -> b) -> (W a -> W b)
fmap f (W x) = W (f x)
Run Code Online (Sandbox Code Playgroud)

文本说,目标是创建一个功能,将a和b类型的现有功能更改为将原始功能应用于Wa和w b的另一个功能。

从这个角度来看,涉及两个函数,类型签名也看起来像这样:它的参数是一个函数,并且提供了一个函数。

首先让我感到困惑的是,ghci告诉我们的fmap的实际类型是:

fmap :: (a -> b) -> W a -> W b
Run Code Online (Sandbox Code Playgroud)

对此进行的思考表明,函数fmap获取一个函数和类型为W a的参数,然后将该函数应用于Wa中的a上,并将结果返回为W b。恰好是fmap代码的功能描述。

我非常确定,如果在类型定义中省略了括号,那么函数的功能不会有任何区别。

我说对了,就像我会说的那样:

addab 是创建函数的函数,可以向其参数添加值

并给出以下示例代码:

addab :: Int -> (Int -> Int)
addab x y = x + y

add1 :: Int -> Int
add1 = addab 1
Run Code Online (Sandbox Code Playgroud)

基本上只是指示该函数是在没有提供所有参数的情况下使用的?

还是我没有考虑的更深层含义?

haskell

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

为什么find()和position()的谓词需要不同的类型?

给出以下代码:

fn main() {
    let vec = vec![0u8, 1, 2, 3, 4, 5, 6];
    // find the first element > 3
    println!("{}", vec.iter().find(|&x| *x > 3).unwrap());
    // find the position of the first element > 3
    println!("{}", vec.iter().position(|&x| x > 3).unwrap());
}
Run Code Online (Sandbox Code Playgroud)

并查看文档:

fn find<P>(&mut self, predicate: P) -> Option<<Self as Iterator>::Item>

fn position<P>(&mut self, predicate: P) -> Option<usize>
Run Code Online (Sandbox Code Playgroud)

我发现很难理解为什么find()需要*xposition()需要x.两者都有&mut self,它看起来好像在谓词中都做同样的工作.

我想这可以通过不同的返回类型推断出来,但具体的规则是什么?

rust

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

在 Haskell 中使用 map 应用常量减法

我只想从 [1,2,3,4] 中的每个列表元素中减去 1,例如

map (-1) [1,2,3,4] -- does not work

map ((-)1) [1,2,3,4] -- gives [0,-1,-2,-3] which is "-listvalue" + 1

map (\x = x - 1) [1,2,3,4] -- what I want but so verbose

map (+ (-1)) [1,2,3,4] -- well :)

map (flip (-) 1) [1,2,3,4] -- I heard of flip before

(map . flip (-)) 1 [1,2,3,4] -- Kinda nice mapped substration composing thingy

map pred [1,2,3,4] -- OK cheated and won't help with -2
Run Code Online (Sandbox Code Playgroud)

我是否错过了“正确”的表格和/或 Haskell …

haskell

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

在Rust中使用if else构造的不同字符串类型

以下显然不起作用:

fn main() {
    for i in range(1i, 101) {
        println!("{}", if i % 15 == 0 {
            "Fizzbuzz"
        } else if i % 5 == 0 {
            "Buzz"
        } else if i % 3 == 0 {
            "Fizz"
        } else {
            i
        });
    };
}
Run Code Online (Sandbox Code Playgroud)

它可以像这样工作:

fn main() {
    for i in range(1i, 101) {
       println!("{}", if i % 15 == 0 {
            "Fizzbuzz".to_string()
        } else if i % 5 == 0 {
            "Buzz".to_string()
        } else if i % …
Run Code Online (Sandbox Code Playgroud)

idioms fizzbuzz rust

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